You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by sa...@apache.org on 2021/04/16 13:12:17 UTC

[incubator-milagro-MPC] 01/05: Bit Commitment and NM Commitment revamp

This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch gg20
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit 6cfbdbf5665522e2974be3ff64fdfd570bfa15c4
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Fri Apr 16 13:58:10 2021 +0100

    Bit Commitment and NM Commitment revamp
    
    Refactor Commitments into NM commitments, BC commitment setup and BC
    commitment.
    Add HDLOG ZKP for BC Commitment Setup
---
 .../{bench_mta_rp.c => bench_bit_commitment.c}     |  51 +-
 benchmark/bench_bit_commitment_ecp.c               | 115 +++
 ...ench_mta_zk.c => bench_bit_commitment_muladd.c} |  51 +-
 ...nch_bc_setup.c => bench_bit_commitment_setup.c} |  78 +-
 benchmark/bench_hidden_dlog.c                      | 214 +++++
 benchmark/bench_mta.c                              |  12 +-
 benchmark/bench_mta_rp.c                           |  34 +-
 benchmark/bench_mta_zk.c                           |  34 +-
 benchmark/bench_mta_zkwc.c                         |  34 +-
 benchmark/bench_nm_commit.c                        |  14 +-
 examples/example_bc_setup.c                        |  78 +-
 examples/example_hidden_dlog.c                     | 168 ++++
 examples/example_nm_commit.c                       |   8 +-
 include/amcl/bit_commitment.h                      | 384 ++++++++
 include/amcl/bit_commitment_setup.h                | 198 +++++
 include/amcl/commitments.h                         | 126 ---
 include/amcl/hash_utils.h                          |  92 ++
 include/amcl/hidden_dlog.h                         | 120 +++
 include/amcl/modulus.h                             |  81 ++
 include/amcl/nm_commitment.h                       |  64 ++
 python/amcl/bit_commitment.py                      | 426 +++++++++
 python/amcl/{commitments.py => nm_commitment.py}   |  24 +-
 python/benchmark/bench_nm_commit.py                |  10 +-
 python/examples/example_bc_setup.py                |  71 ++
 python/examples/example_nm_commit.py               |   9 +-
 python/test/CMakeLists.txt                         |  10 +-
 python/test/test_bc_setup.py                       | 188 ++++
 python/test/test_nm_commit.py                      |  17 +-
 src/bit_commitment.c                               | 972 +++++++++++++++++++++
 src/bit_commitment_setup.c                         | 356 ++++++++
 src/commitments.c                                  | 294 -------
 src/hash_utils.c                                   | 106 +++
 src/hidden_dlog.c                                  | 275 ++++++
 test/smoke/test_nm_commit_smoke.c => src/modulus.c |  48 +-
 src/nm_commitment.c                                |  82 ++
 test/smoke/test_bit_commitment_muladd_smoke.c      | 148 ++++
 ...p_smoke.c => test_bit_commitment_setup_smoke.c} |  64 +-
 test/smoke/test_bit_commitment_smoke.c             | 150 ++++
 test/smoke/test_hidden_dlog_smoke.c                | 139 +++
 test/smoke/test_nm_commit_smoke.c                  |  10 +-
 test/test.c                                        |  62 ++
 test/test.h                                        |  29 +
 test/unit/CMakeLists.txt                           |  27 +-
 test/unit/test_bit_commitment_commit.c             | 135 +++
 test/unit/test_bit_commitment_ecp_commit.c         |  92 ++
 test/unit/test_bit_commitment_ecp_verify.c         | 109 +++
 test/unit/test_bit_commitment_muladd_commit.c      | 151 ++++
 test/unit/test_bit_commitment_muladd_octets.c      | 140 +++
 test/unit/test_bit_commitment_muladd_prove.c       | 150 ++++
 test/unit/test_bit_commitment_muladd_verify.c      | 203 +++++
 test/unit/test_bit_commitment_octets.c             | 124 +++
 test/unit/test_bit_commitment_prove.c              | 140 +++
 ...test_bc_setup.c => test_bit_commitment_setup.c} |  46 +-
 ...als.c => test_bit_commitment_setup_internals.c} |   4 +-
 test/unit/test_bit_commitment_verify.c             | 174 ++++
 test/unit/test_bit_commitments_muladd_octets.c     |   0
 test/unit/test_hidden_dlog_challenge.c             | 131 +++
 test/unit/test_hidden_dlog_commit.c                | 114 +++
 test/unit/test_hidden_dlog_prove.c                 | 106 +++
 test/unit/test_hidden_dlog_verify.c                | 117 +++
 test/unit/test_nm_commit.c                         |  18 +-
 testVectors/bit_commitment/ecp_commit.json         |  52 ++
 testVectors/bit_commitment/ecp_commit.txt          |  40 +
 testVectors/bit_commitment/ecp_verify.json         |  72 ++
 testVectors/bit_commitment/ecp_verify.txt          |  60 ++
 testVectors/bit_commitment/muladd_commit.json      | 222 +++++
 testVectors/bit_commitment/muladd_commit.txt       | 210 +++++
 testVectors/bit_commitment/muladd_octets.json      | 132 +++
 testVectors/bit_commitment/muladd_octets.txt       | 120 +++
 testVectors/bit_commitment/muladd_prove.json       | 202 +++++
 testVectors/bit_commitment/muladd_prove.txt        | 190 ++++
 testVectors/bit_commitment/muladd_verify.json      | 222 +++++
 testVectors/bit_commitment/muladd_verify.txt       | 210 +++++
 testVectors/bit_commitment/plain_commit.json       | 162 ++++
 testVectors/bit_commitment/plain_commit.txt        | 150 ++++
 testVectors/bit_commitment/plain_octets.json       |  93 ++
 testVectors/bit_commitment/plain_octets.txt        |  80 ++
 testVectors/bit_commitment/plain_prove.json        | 152 ++++
 testVectors/bit_commitment/plain_prove.txt         | 140 +++
 testVectors/bit_commitment/plain_verify.json       | 162 ++++
 testVectors/bit_commitment/plain_verify.txt        | 150 ++++
 .../bc_setup.json => bit_commitment/setup.json}    |   0
 .../bc_setup.txt => bit_commitment/setup.txt}      |   0
 testVectors/hidden_dlog/challenge.txt              |  90 ++
 testVectors/hidden_dlog/commit.txt                 |  32 +
 testVectors/hidden_dlog/prove.txt                  |  28 +
 testVectors/hidden_dlog/verify.txt                 |  32 +
 .../nm_commit.json => nm_commitment/commit.json}   |   0
 .../nm_commit.txt => nm_commitment/commit.txt}     |   0
 89 files changed, 9741 insertions(+), 689 deletions(-)

diff --git a/benchmark/bench_mta_rp.c b/benchmark/bench_bit_commitment.c
similarity index 89%
copy from benchmark/bench_mta_rp.c
copy to benchmark/bench_bit_commitment.c
index 68d2627..3dc377e 100644
--- a/benchmark/bench_mta_rp.c
+++ b/benchmark/bench_bit_commitment.c
@@ -18,11 +18,11 @@ under the License.
 */
 
 /*
-   Benchmark ZKP of knowledge of factoring.
+   Benchmark Bit Commitment Paillier Plaintext Proof.
  */
 
 #include "bench.h"
-#include "amcl/mta.h"
+#include "amcl/bit_commitment.h"
 
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
@@ -57,13 +57,14 @@ int main()
     double elapsed;
 
     PAILLIER_private_key priv_key;
-    PAILLIER_public_key pub_key;
-    COMMITMENTS_BC_priv_modulus priv_mod;
-    COMMITMENTS_BC_pub_modulus pub_mod;
+    PAILLIER_public_key  pub_key;
 
-    MTA_RP_commitment co;
-    MTA_RP_commitment_rv rv;
-    MTA_RP_proof proof;
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
+
+    BIT_COMMITMENT_commitment co;
+    BIT_COMMITMENT_rv         rv;
+    BIT_COMMITMENT_proof      proof;
 
     char c[2*FS_2048];
     octet C = {0, sizeof(c), c};
@@ -102,8 +103,8 @@ int main()
     OCT_fromHex(&Q,     QT_hex);
     OCT_fromHex(&ALPHA, ALPHA_hex);
     OCT_fromHex(&B0,    B0_hex);
-    COMMITMENTS_BC_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
-    COMMITMENTS_BC_export_public_modulus(&pub_mod, &priv_mod);
+    BIT_COMMITMENT_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
 
     // Load Paillier encryption values
     OCT_fromHex(&M, M_hex);
@@ -133,62 +134,48 @@ int main()
     start = clock();
     do
     {
-        MTA_RP_commit(NULL, &priv_key, &pub_mod, &M, &co, &rv);
+        BIT_COMMITMENT_commit(NULL, &priv_key, &pub_mod, &M, &rv, &co);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tMTA_RP_commit\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_commit\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        MTA_RP_challenge(&pub_key, &pub_mod, &C, &co, &E);
-        iterations++;
-        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
-    }
-    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
-
-    elapsed = MICROSECOND * elapsed / iterations;
-    printf("\tMTA_RP_challenge\t%8d iterations\t", iterations);
-    printf("%8.2lf us per iteration\n", elapsed);
-
-    iterations = 0;
-    start = clock();
-    do
-    {
-        MTA_RP_prove(&priv_key, &rv, &M, &R, &E, &proof);
+        BIT_COMMITMENT_prove(&priv_key, &M, &R, &rv, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tMTA_RP_prove\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_prove\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        rc = MTA_RP_verify(&pub_key, &priv_mod, &C, &E, &co, &proof);
+        rc = BIT_COMMITMENT_verify(&pub_key, &priv_mod, &C, &co, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
-    if (rc != MTA_OK)
+    if (rc != BIT_COMMITMENT_OK)
     {
-        printf("FAILURE MTA_RP_verify: %d\n", rc);
+        printf("FAILURE BIT_COMMITMENT_verify: %d\n", rc);
         exit(EXIT_FAILURE);
     }
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tMTA_RP_verify\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_verify\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     exit(EXIT_SUCCESS);
diff --git a/benchmark/bench_bit_commitment_ecp.c b/benchmark/bench_bit_commitment_ecp.c
new file mode 100644
index 0000000..0444c7d
--- /dev/null
+++ b/benchmark/bench_bit_commitment_ecp.c
@@ -0,0 +1,115 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/*
+   Benchmark Bit Commitment Paillier muladd Proof.
+ */
+
+#include "bench.h"
+#include "amcl/bit_commitment.h"
+
+#define MIN_TIME 5.0
+#define MIN_ITERS 10
+
+char *ALPHA_hex = "00000000000000000000000000000000000000000000000000000000000000001ff0a71a5b642d440b19a143dd95c2fe12b62b4e66fcfaf623bf9baea2dfdf2ecd25286192dfb043c1eef7b5bd763f72389fae5aefbfaf476abcaedad3acf299aaec8cad2f9e61dd07b9027e6df317ead1f33876ce5ab88c63b933ccfeed39f8";
+
+char *R_hex = "020397904ae1a4181314106a8c968e7fcfbaef2b337f1574f0adc5245fc31b8729";
+char *X_hex = "033049ded76beb67586e2ff29f4751a4ee25f5a6fc0c66d6efee0799f0070e4536";
+
+char *E_hex  = "5de0ddb8904e679dd599bbed2b0dbbe86e5f34852f4903addcd0907737f8ca44";
+char *S1_hex = "00000000000000000000000000000000000000000000000000000000000000001ff0a71a5b642d440b19a143dd95c2fe12b62b4e66fcfaf623bf9baea2dfdf2edad24be4486d1c9a1d9b9a6225b714dd89e1869d22b6bebc172773ae07cfbf3c4d6181bf190a2bf8dbf13d7620fdb6b0cedef398fd50efe5c652969380249a94";
+
+int main()
+{
+    int rc;
+
+    int iterations;
+    clock_t start;
+    double elapsed;
+
+    ECP_SECP256K1 R;
+    ECP_SECP256K1 X;
+    ECP_SECP256K1 U;
+
+    BIG_1024_58 alpha[HFLEN_2048];
+    BIG_1024_58 s1[HFLEN_2048];
+
+    char oct[HFS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Load hex values
+    OCT_fromHex(&OCT, R_hex);
+    rc = ECP_SECP256K1_fromOctet(&R, &OCT);
+    if (rc != 1)
+    {
+        printf("Invalid R hex\n");
+        exit(EXIT_FAILURE);
+    }
+
+    OCT_fromHex(&OCT, X_hex);
+    rc = ECP_SECP256K1_fromOctet(&X, &OCT);
+    if (rc != 1)
+    {
+        printf("Invalid X hex\n");
+        exit(EXIT_FAILURE);
+    }
+
+    OCT_fromHex(&OCT, ALPHA_hex);
+    FF_2048_fromOctet(alpha, &OCT, HFLEN_2048);
+    OCT_fromHex(&OCT, S1_hex);
+    FF_2048_fromOctet(s1, &OCT, HFLEN_2048);
+
+    OCT_fromHex(&OCT, E_hex);
+
+    print_system_info();
+
+    printf("Timing info\n");
+    printf("===========\n");
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        ECP_SECP256K1_copy(&U, &R);
+        BIT_COMMITMENT_ECP_commit(&U, alpha);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MICROSECOND * elapsed / iterations;
+    printf("\tBIT_COMMITMENT_ECP_commit\t%8d iterations\t", iterations);
+    printf("%8.2lf us per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        rc = BIT_COMMITMENT_ECP_verify(&R, &X, &U, &OCT, s1);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MICROSECOND * elapsed / iterations;
+    printf("\tBIT_COMMITMENT_ECP_verify\t%8d iterations\t", iterations);
+    printf("%8.2lf us per iteration\n", elapsed);
+
+    exit(EXIT_SUCCESS);
+}
\ No newline at end of file
diff --git a/benchmark/bench_mta_zk.c b/benchmark/bench_bit_commitment_muladd.c
similarity index 91%
copy from benchmark/bench_mta_zk.c
copy to benchmark/bench_bit_commitment_muladd.c
index ebbbdd1..b1708ed 100644
--- a/benchmark/bench_mta_zk.c
+++ b/benchmark/bench_bit_commitment_muladd.c
@@ -18,11 +18,11 @@ under the License.
 */
 
 /*
-   Benchmark ZKP of knowledge of factoring.
+   Benchmark Bit Commitment Paillier muladd Proof.
  */
 
 #include "bench.h"
-#include "amcl/mta.h"
+#include "amcl/bit_commitment.h"
 
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
@@ -62,13 +62,14 @@ int main()
     double elapsed;
 
     PAILLIER_private_key priv_key;
-    PAILLIER_public_key pub_key;
-    COMMITMENTS_BC_priv_modulus priv_mod;
-    COMMITMENTS_BC_pub_modulus pub_mod;
+    PAILLIER_public_key  pub_key;
 
-    MTA_ZK_commitment c;
-    MTA_ZK_commitment_rv rv;
-    MTA_ZK_proof proof;
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
+
+    BIT_COMMITMENT_muladd_commitment c;
+    BIT_COMMITMENT_muladd_rv         rv;
+    BIT_COMMITMENT_muladd_proof      proof;
 
     char c1[2*FS_2048];
     octet C1 = {0, sizeof(c1), c1};
@@ -113,8 +114,8 @@ int main()
     OCT_fromHex(&Q,     QT_hex);
     OCT_fromHex(&ALPHA, ALPHA_hex);
     OCT_fromHex(&B0,    B0_hex);
-    COMMITMENTS_BC_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
-    COMMITMENTS_BC_export_public_modulus(&pub_mod, &priv_mod);
+    BIT_COMMITMENT_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
 
     // Load Paillier encryption values
     OCT_fromHex(&X,  X_hex);
@@ -155,62 +156,48 @@ int main()
     start = clock();
     do
     {
-        MTA_ZK_commit(NULL, &pub_key, &pub_mod, &X, &Y, &C1, &c, &rv);
+        BIT_COMMITMENT_muladd_commit(NULL, &pub_key, &pub_mod, &X, &Y, &C1, &rv, &c);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tMTA_ZK_commit\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_muladd_commit\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        MTA_ZK_challenge(&pub_key, &pub_mod, &C1, &C2, &c, &E);
-        iterations++;
-        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
-    }
-    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
-
-    elapsed = MICROSECOND * elapsed / iterations;
-    printf("\tMTA_ZK_challenge\t%8d iterations\t", iterations);
-    printf("%8.2lf us per iteration\n", elapsed);
-
-    iterations = 0;
-    start = clock();
-    do
-    {
-        MTA_ZK_prove(&pub_key, &rv, &X, &Y, &R, &E, &proof);
+        BIT_COMMITMENT_muladd_prove(&pub_key, &X, &Y, &R, &rv, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tMTA_ZK_prove\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_muladd_prove\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        rc = MTA_ZK_verify(&priv_key, &priv_mod, &C1, &C2, &E, &c, &proof);
+        rc = BIT_COMMITMENT_muladd_verify(&priv_key, &priv_mod, &C1, &C2, &c, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
-    if (rc != MTA_OK)
+    if (rc != BIT_COMMITMENT_OK)
     {
-        printf("FAILURE MTA_ZK_verify: %d\n", rc);
+        printf("FAILURE BIT_COMMITMENT_muladd_verify: %d\n", rc);
         exit(EXIT_FAILURE);
     }
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tMTA_ZK_verify\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_muladd_verify\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     exit(EXIT_SUCCESS);
diff --git a/benchmark/bench_bc_setup.c b/benchmark/bench_bit_commitment_setup.c
similarity index 62%
rename from benchmark/bench_bc_setup.c
rename to benchmark/bench_bit_commitment_setup.c
index 76470ce..30eecdf 100644
--- a/benchmark/bench_bc_setup.c
+++ b/benchmark/bench_bit_commitment_setup.c
@@ -22,7 +22,7 @@ under the License.
  */
 
 #include "bench.h"
-#include "commitments.c"
+#include "bit_commitment_setup.c"
 
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
@@ -36,6 +36,8 @@ int main()
     clock_t start;
     double elapsed;
 
+    int rc;
+
     char p[HFS_2048];
     octet P = {0, sizeof(p), p};
 
@@ -46,7 +48,18 @@ int main()
     BIG_1024_58 sp[HFLEN_2048];
     BIG_1024_58 x[FFLEN_2048];
 
-    COMMITMENTS_BC_priv_modulus m;
+    BIT_COMMITMENT_priv m;
+
+    // Material for proof
+    BIT_COMMITMENT_pub pub;
+
+    BIT_COMMITMENT_setup_proof proof;
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
 
     // Load values
     OCT_fromHex(&P, Phex);
@@ -77,7 +90,7 @@ int main()
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tis_safe_prime\t\t\t\t%8d iterations\t", iterations);
+    printf("\tis_safe_prime\t\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
@@ -90,36 +103,85 @@ int main()
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
+    elapsed = MICROSECOND * elapsed / iterations;
+    printf("\tbc_generator\t\t\t%8d iterations\t", iterations);
+    printf("%8.2lf us per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        BIT_COMMITMENT_setup(&RNG, &m, &P, &Q, NULL, NULL);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tbc_generator\t\t\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_setup\t\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        COMMITMENTS_BC_setup(&RNG, &m, &P, &Q, NULL, NULL);
+        BIT_COMMITMENT_setup_prove(&RNG, &m, &proof, &ID, &AD);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MILLISECOND * elapsed / iterations;
-    printf("\tCOMMITMENTS_BC_setup\t\t\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_setup_prove\t%8d iterations\t", iterations);
     printf("%8.2lf ms per iteration\n", elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        COMMITMENTS_BC_kill_priv_modulus(&m);
+        BIT_COMMITMENT_priv_to_pub(&pub, &m);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MICROSECOND * elapsed / iterations;
+    printf("\tBIT_COMMITMENT_priv_to_pub\t%8d iterations\t", iterations);
+    printf("%8.2lf us per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        rc = BIT_COMMITMENT_setup_verify(&pub, &proof, &ID, &AD);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    if (rc != BIT_COMMITMENT_OK)
+    {
+        printf("FAILURE BIT_COMMITMENT_setup_verify");
+        exit(EXIT_FAILURE);
+    }
+
+    elapsed = MILLISECOND * elapsed / iterations;
+    printf("\tBIT_COMMITMENT_setup_verify\t%8d iterations\t", iterations);
+    printf("%8.2lf ms per iteration\n", elapsed);
+
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        BIT_COMMITMENT_priv_kill(&m);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
     elapsed = MICROSECOND * elapsed / iterations;
-    printf("\tCOMMITMENTS_BC_kill_priv_modulus\t%8d iterations\t", iterations);
+    printf("\tBIT_COMMITMENT_priv_kill\t%8d iterations\t", iterations);
     printf("%8.2lf us per iteration\n", elapsed);
 
     exit(EXIT_SUCCESS);
diff --git a/benchmark/bench_hidden_dlog.c b/benchmark/bench_hidden_dlog.c
new file mode 100644
index 0000000..dd06087
--- /dev/null
+++ b/benchmark/bench_hidden_dlog.c
@@ -0,0 +1,214 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* ZKPoK of DLOG over a hidden order group benchmark */
+
+#include "bench.h"
+#include "amcl/hidden_dlog.h"
+
+#define MIN_TIME 5.0
+#define MIN_ITERS 10
+
+char *ID_str = "unique_identifier_123";
+char *AD_hex = "d7d3155616778fb436a1eb2070892205";
+
+// Safe primes P = 2p+1, Q = 2q+1
+char *Phex  = "e41615620cb68a9ea8df28551b27f333cf65c770c7e959435786d4b510fe360a304fd2bf437431e790dc4c54da6db03119e75ef0b3f47436acf78a9e7b2276ebdd864e49d3bf450c496b10471f024dc4ae1f659c41aacdfb8ee6d52ba46a82d41f79a14277a61474a6473b7e4ab82528383d6400dc71278941e16c138d74d5bb";
+char *Qhex  = "d344c02d8379387e773ab6fa6de6b92b395d5b7f0c41660778766a1ec4740468203bff2d05f263ff6f22740d4b2e799fd1fd2e2339e328c62d31eeecba30fd4892e0c1637e0f62b4de34f5d778a7dfd181b94464f3669751264a0058708a360552535653efc75e3035485e966df30a17146d692747e20b2f04f3877dd1f56dcf";
+
+// B1 = B0 ^ A mod PQ with B0 generator of G_pq
+char *Ahex  = "2545cf613d4a6fa16bec6ec4dfc0c512bb6b8ea31250414f01f466776d30ca080e323392759180cf0e853a9168b59cf32589f84c1380c3a1482c031cb3b32b5e2dc062dde861fe09dd57afb1c2b8674a35dfe016368e2345592fd90e76060532ce61cbec50a49c67c5ab3f3b433aaa8d0480f79123b14a375f6a8f8ebc91cabd8e5fe5428a37f11caee1f7833418d60c2a757304ca1f12e2a63a366e7ec3007a4c62b068b6207aa2ce2ea287fbdeff973f4a725da10df44134a8f981f22157ee932a3b3565ec723af666553c668fcd31cf342712b4dff9bb5e95dc0d6cc23cfb31b9fdd92f00a35a200c2656054bb [...]
+char *B0hex = "5e712c49e4648060d2a1f4487aa56496f75106571e4f6fedebf0150fa628d968e8694919d151e21a521c3e80309e5830b4c284f0e00e084fbac1defffbbf2f4f467b2ba14b7ca796fab4574310bf5afead953bfaf01750f0dd8f771df7bc6cfa64b9a108648d8a180a361f5faa9549a56afae8b2bd0563b5591a20439e0781babb280ab30f2b5b6abe4e35b600403f9e86564197fd7a5da724f3fb265600c619645b50cad7ed2597c189b082a18f641dbbf79c28a75add4915ce0ff19ef229a4d03e11cdc1b37d42df20c25b6cd991ab8b31d82051bcb7c3848ca1eac18cb9bab5eaf36390f90bf7e34aace31279c [...]
+char *B1hex = "199540bcefff1aa1af7d665e5fb401a57a0962004fd0f6c4e7ec1543daf9a57c4e758b7e3bb8e9bb9528699cddd5ae23522decee78a67da3a872e1b2fcbc3be354674fd4c037639da2ace925805471bf960d6679bfdac6b722bd1f607f314e05c2c2b7f5af9d85c49c82a40a91b217806f8e18fc1b3746f380b0512458fc7f81e58a052afadcd9fe448e61ce846ab729344b9c845dd4590888ee25abc695ef04efdd9f02a35e89bb563a68cb54ed8a7fba6de284385b8e065372082b10b00499f62dd522ad51d0a4f44f509876b6b3a9e824e172550ef09f5d07183b6ab87671fda390a5a080f50e88d987c5d0ea6 [...]
+
+int main()
+{
+    int rc;
+
+    int iterations;
+    clock_t start;
+    double elapsed;
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+
+    char w[HDLOG_VALUES_SIZE];
+    octet W = {0, sizeof(w), w};
+
+    MODULUS_priv m;
+
+    BIG_1024_58 ord[FFLEN_2048];
+
+    BIG_1024_58 alpha[FFLEN_2048];
+    BIG_1024_58 b0[FFLEN_2048];
+    BIG_1024_58 b1[FFLEN_2048];
+
+    BIG_1024_58 ws1[HFLEN_2048];
+    BIG_1024_58 ws2[HFLEN_2048];
+
+    HDLOG_iter_values r;
+    HDLOG_iter_values rho;
+    HDLOG_iter_values t;
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+
+    // Deterministic RNG for benchmark
+    //
+    // Using this instead of pre-generated values
+    // because the amount of randomness to generate
+    // is not negligible
+    char seed[32] = {0};
+    csprng RNG;
+    RAND_seed(&RNG, 32, seed);
+
+    // Load values
+    OCT_jstring(&ID, ID_str);
+    OCT_fromHex(&AD, AD_hex);
+
+    OCT_fromHex(&P, Phex);
+    OCT_fromHex(&Q, Qhex);
+
+    MODULUS_fromOctets(&m, &P, &Q);
+
+    OCT_fromHex(&W, Ahex);
+    FF_2048_fromOctet(alpha, &W, FFLEN_2048);
+
+    OCT_fromHex(&W, B0hex);
+    FF_2048_fromOctet(b0, &W, FFLEN_2048);
+
+    OCT_fromHex(&W, B1hex);
+    FF_2048_fromOctet(b1, &W, FFLEN_2048);
+
+    // Compute order of B0
+    FF_2048_copy(ws1, m.p, HFLEN_2048);
+    FF_2048_copy(ws2, m.q, HFLEN_2048);
+
+    FF_2048_shr(ws1, HFLEN_2048);
+    FF_2048_shr(ws2, HFLEN_2048);
+
+    FF_2048_mul(ord, ws1, ws2, HFLEN_2048);
+
+    // Benchmark
+    print_system_info();
+
+    printf("Timing info\n");
+    printf("===========\n");
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        HDLOG_commit(&RNG, &m, ord, b0, r, rho);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MILLISECOND * elapsed / iterations;
+    printf("\tHDLOG_commit\t\t\t%8d iterations\t", iterations);
+    printf("%8.2lf ms per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        HDLOG_challenge(m.n, b0, b1, rho, &ID, &AD, &E);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MILLISECOND * elapsed / iterations;
+    printf("\tHDLOG_challenge\t\t\t%8d iterations\t", iterations);
+    printf("%8.2lf ms per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        HDLOG_prove(ord, alpha, r, &E, t);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MICROSECOND * elapsed / iterations;
+    printf("\tHDLOG_prove\t\t\t%8d iterations\t", iterations);
+    printf("%8.2lf us per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        rc = HDLOG_verify(m.n, b0, b1, rho, &E, t);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    if (rc != HDLOG_OK)
+    {
+        fprintf(stderr, "FAILURE HDLOG_verify failed");
+        exit(EXIT_FAILURE);
+    }
+
+    elapsed = MILLISECOND * elapsed / iterations;
+    printf("\tHDLOG_verify\t\t\t%8d iterations\t", iterations);
+    printf("%8.2lf ms per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        HDLOG_iter_values_toOctet(&W, rho);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MILLISECOND * elapsed / iterations;
+    printf("\tHDLOG_iter_values_toOctet\t%8d iterations\t", iterations);
+    printf("%8.2lf ms per iteration\n", elapsed);
+
+    iterations = 0;
+    start = clock();
+    do
+    {
+        HDLOG_iter_values_fromOctet(rho, &W);
+        iterations++;
+        elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
+    }
+    while (elapsed < MIN_TIME || iterations < MIN_ITERS);
+
+    elapsed = MILLISECOND * elapsed / iterations;
+    printf("\tHDLOG_iter_values_fromOctet\t%8d iterations\t", iterations);
+    printf("%8.2lf ms per iteration\n", elapsed);
+
+    exit(EXIT_SUCCESS);
+}
diff --git a/benchmark/bench_mta.c b/benchmark/bench_mta.c
index d70f0c1..ba095ac 100644
--- a/benchmark/bench_mta.c
+++ b/benchmark/bench_mta.c
@@ -89,13 +89,13 @@ int main()
     start=clock();
     do
     {
-        MPC_MTA_CLIENT1(&RNG, &PUB, &A, &CA, NULL);
+        MTA_CLIENT1(&RNG, &PUB, &A, &CA, NULL);
         iterations++;
         elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
     }
     while (elapsed<MIN_TIME || iterations<MIN_ITERS);
     elapsed=1000.0*elapsed/iterations;
-    printf("MPC_MTA_CLIENT1\t%8d iterations\t",iterations);
+    printf("MTA_CLIENT1\t%8d iterations\t",iterations);
     printf("%8.2lf ms per iteration\n",elapsed);
 
     iterations=0;
@@ -103,26 +103,26 @@ int main()
     do
     {
 
-        MPC_MTA_SERVER(&RNG, &PUB, &B, &CA, NULL, NULL, &CB, &BETA);
+        MTA_SERVER(&RNG, &PUB, &B, &CA, NULL, NULL, &CB, &BETA);
         iterations++;
         elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
     }
     while (elapsed<MIN_TIME || iterations<MIN_ITERS);
     elapsed=1000.0*elapsed/iterations;
-    printf("MPC_MTA_SERVER\t%8d iterations\t",iterations);
+    printf("MTA_SERVER\t%8d iterations\t",iterations);
     printf("%8.2lf ms per iteration\n",elapsed);
 
     iterations=0;
     start=clock();
     do
     {
-        MPC_MTA_CLIENT2(&PRIV, &CB, &ALPHA);
+        MTA_CLIENT2(&PRIV, &CB, &ALPHA);
         iterations++;
         elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
     }
     while (elapsed<MIN_TIME || iterations<MIN_ITERS);
     elapsed=1000.0*elapsed/iterations;
-    printf("MPC_MTA_CLIENT2\t%8d iterations\t",iterations);
+    printf("MTA_CLIENT2\t%8d iterations\t",iterations);
     printf("%8.2lf ms per iteration\n",elapsed);
 
     exit(EXIT_SUCCESS);
diff --git a/benchmark/bench_mta_rp.c b/benchmark/bench_mta_rp.c
index 68d2627..a201358 100644
--- a/benchmark/bench_mta_rp.c
+++ b/benchmark/bench_mta_rp.c
@@ -18,11 +18,11 @@ under the License.
 */
 
 /*
-   Benchmark ZKP of knowledge of factoring.
+   Benchmark MTA Range Proof.
  */
 
 #include "bench.h"
-#include "amcl/mta.h"
+#include "amcl/mta_zkp.h"
 
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
@@ -57,13 +57,14 @@ int main()
     double elapsed;
 
     PAILLIER_private_key priv_key;
-    PAILLIER_public_key pub_key;
-    COMMITMENTS_BC_priv_modulus priv_mod;
-    COMMITMENTS_BC_pub_modulus pub_mod;
+    PAILLIER_public_key  pub_key;
+
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
 
     MTA_RP_commitment co;
-    MTA_RP_commitment_rv rv;
-    MTA_RP_proof proof;
+    MTA_RP_rv         rv;
+    MTA_RP_proof      proof;
 
     char c[2*FS_2048];
     octet C = {0, sizeof(c), c};
@@ -92,6 +93,13 @@ int main()
     char oct[FS_2048 + HFS_2048];
     octet OCT = {0, sizeof(oct), oct};
 
+    // Leave these blank (but not empty!)
+    char id[32] = {0};
+    octet ID = {sizeof(id), sizeof(id), id};
+
+    char ad[32] = {0};
+    octet AD = {sizeof(ad), sizeof(ad), ad};
+
     // Load paillier key
     OCT_fromHex(&P, P_hex);
     OCT_fromHex(&Q, Q_hex);
@@ -102,8 +110,8 @@ int main()
     OCT_fromHex(&Q,     QT_hex);
     OCT_fromHex(&ALPHA, ALPHA_hex);
     OCT_fromHex(&B0,    B0_hex);
-    COMMITMENTS_BC_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
-    COMMITMENTS_BC_export_public_modulus(&pub_mod, &priv_mod);
+    BIT_COMMITMENT_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
 
     // Load Paillier encryption values
     OCT_fromHex(&M, M_hex);
@@ -133,7 +141,7 @@ int main()
     start = clock();
     do
     {
-        MTA_RP_commit(NULL, &priv_key, &pub_mod, &M, &co, &rv);
+        MTA_RP_commit(NULL, &priv_key, &pub_mod, &M, &rv, &co);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -147,7 +155,7 @@ int main()
     start = clock();
     do
     {
-        MTA_RP_challenge(&pub_key, &pub_mod, &C, &co, &E);
+        MTA_RP_challenge(&pub_key, &pub_mod, &C, &co, &ID, &AD, &E);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -161,7 +169,7 @@ int main()
     start = clock();
     do
     {
-        MTA_RP_prove(&priv_key, &rv, &M, &R, &E, &proof);
+        MTA_RP_prove(&priv_key, &M, &R, &rv, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -175,7 +183,7 @@ int main()
     start = clock();
     do
     {
-        rc = MTA_RP_verify(&pub_key, &priv_mod, &C, &E, &co, &proof);
+        rc = MTA_RP_verify(&pub_key, &priv_mod, &C, &co, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
diff --git a/benchmark/bench_mta_zk.c b/benchmark/bench_mta_zk.c
index ebbbdd1..240949c 100644
--- a/benchmark/bench_mta_zk.c
+++ b/benchmark/bench_mta_zk.c
@@ -18,11 +18,11 @@ under the License.
 */
 
 /*
-   Benchmark ZKP of knowledge of factoring.
+   Benchmark MTA Receiver Proof.
  */
 
 #include "bench.h"
-#include "amcl/mta.h"
+#include "amcl/mta_zkp.h"
 
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
@@ -62,13 +62,14 @@ int main()
     double elapsed;
 
     PAILLIER_private_key priv_key;
-    PAILLIER_public_key pub_key;
-    COMMITMENTS_BC_priv_modulus priv_mod;
-    COMMITMENTS_BC_pub_modulus pub_mod;
+    PAILLIER_public_key  pub_key;
+
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
 
     MTA_ZK_commitment c;
-    MTA_ZK_commitment_rv rv;
-    MTA_ZK_proof proof;
+    MTA_ZK_rv         rv;
+    MTA_ZK_proof      proof;
 
     char c1[2*FS_2048];
     octet C1 = {0, sizeof(c1), c1};
@@ -103,6 +104,13 @@ int main()
     char oct[FS_2048 + HFS_2048];
     octet OCT = {0, sizeof(oct), oct};
 
+    // Leave these blank (but not empty!)
+    char id[32] = {0};
+    octet ID = {sizeof(id), sizeof(id), id};
+
+    char ad[32] = {0};
+    octet AD = {sizeof(ad), sizeof(ad), ad};
+
     // Load paillier key
     OCT_fromHex(&P, P_hex);
     OCT_fromHex(&Q, Q_hex);
@@ -113,8 +121,8 @@ int main()
     OCT_fromHex(&Q,     QT_hex);
     OCT_fromHex(&ALPHA, ALPHA_hex);
     OCT_fromHex(&B0,    B0_hex);
-    COMMITMENTS_BC_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
-    COMMITMENTS_BC_export_public_modulus(&pub_mod, &priv_mod);
+    BIT_COMMITMENT_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
 
     // Load Paillier encryption values
     OCT_fromHex(&X,  X_hex);
@@ -155,7 +163,7 @@ int main()
     start = clock();
     do
     {
-        MTA_ZK_commit(NULL, &pub_key, &pub_mod, &X, &Y, &C1, &c, &rv);
+        MTA_ZK_commit(NULL, &pub_key, &pub_mod, &X, &Y, &C1, &rv, &c);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -169,7 +177,7 @@ int main()
     start = clock();
     do
     {
-        MTA_ZK_challenge(&pub_key, &pub_mod, &C1, &C2, &c, &E);
+        MTA_ZK_challenge(&pub_key, &pub_mod, &C1, &C2, &c, &ID, &AD, &E);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -183,7 +191,7 @@ int main()
     start = clock();
     do
     {
-        MTA_ZK_prove(&pub_key, &rv, &X, &Y, &R, &E, &proof);
+        MTA_ZK_prove(&pub_key, &X, &Y, &R, &rv, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -197,7 +205,7 @@ int main()
     start = clock();
     do
     {
-        rc = MTA_ZK_verify(&priv_key, &priv_mod, &C1, &C2, &E, &c, &proof);
+        rc = MTA_ZK_verify(&priv_key, &priv_mod, &C1, &C2, &c, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
diff --git a/benchmark/bench_mta_zkwc.c b/benchmark/bench_mta_zkwc.c
index d9db043..1d2a7f8 100644
--- a/benchmark/bench_mta_zkwc.c
+++ b/benchmark/bench_mta_zkwc.c
@@ -18,11 +18,11 @@ under the License.
 */
 
 /*
-   Benchmark ZKP of knowledge of factoring.
+   Benchmark MTA receiver ZKP with check .
  */
 
 #include "bench.h"
-#include "amcl/mta.h"
+#include "amcl/mta_zkp.h"
 
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
@@ -65,13 +65,14 @@ int main()
     double elapsed;
 
     PAILLIER_private_key priv_key;
-    PAILLIER_public_key pub_key;
-    COMMITMENTS_BC_priv_modulus priv_mod;
-    COMMITMENTS_BC_pub_modulus pub_mod;
+    PAILLIER_public_key  pub_key;
+
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
 
     MTA_ZKWC_commitment c;
-    MTA_ZKWC_commitment_rv rv;
-    MTA_ZKWC_proof proof;
+    MTA_ZKWC_rv         rv;
+    MTA_ZKWC_proof      proof;
 
     char c1[2*FS_2048];
     octet C1 = {0, sizeof(c1), c1};
@@ -109,6 +110,13 @@ int main()
     char oct[FS_2048 + HFS_2048];
     octet OCT = {0, sizeof(oct), oct};
 
+    // Leave these blank (but not empty!)
+    char id[32] = {0};
+    octet ID = {sizeof(id), sizeof(id), id};
+
+    char ad[32] = {0};
+    octet AD = {sizeof(ad), sizeof(ad), ad};
+
     // Load paillier key
     OCT_fromHex(&P, P_hex);
     OCT_fromHex(&Q, Q_hex);
@@ -122,8 +130,8 @@ int main()
     OCT_fromHex(&Q,     QT_hex);
     OCT_fromHex(&ALPHA, ALPHA_hex);
     OCT_fromHex(&B0,    B0_hex);
-    COMMITMENTS_BC_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
-    COMMITMENTS_BC_export_public_modulus(&pub_mod, &priv_mod);
+    BIT_COMMITMENT_setup(NULL, &priv_mod, &P, &Q, &ALPHA, &B0);
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
 
     // Load Paillier encryption values
     OCT_fromHex(&X,  X_hex);
@@ -164,7 +172,7 @@ int main()
     start = clock();
     do
     {
-        MTA_ZKWC_commit(NULL, &pub_key, &pub_mod, &X, &Y, &C1, &c, &rv);
+        MTA_ZKWC_commit(NULL, &pub_key, &pub_mod, &X, &Y, &C1, &rv, &c);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -178,7 +186,7 @@ int main()
     start = clock();
     do
     {
-        MTA_ZKWC_challenge(&pub_key, &pub_mod, &C1, &C2, &ECPX, &c, &E);
+        MTA_ZKWC_challenge(&pub_key, &pub_mod, &C1, &C2, &ECPX, &c, &ID, &AD, &E);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -192,7 +200,7 @@ int main()
     start = clock();
     do
     {
-        MTA_ZKWC_prove(&pub_key, &rv, &X, &Y, &R, &E, &proof);
+        MTA_ZKWC_prove(&pub_key, &X, &Y, &R, &rv, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -206,7 +214,7 @@ int main()
     start = clock();
     do
     {
-        rc = MTA_ZKWC_verify(&priv_key, &priv_mod, &C1, &C2, &ECPX, &E, &c, &proof);
+        rc = MTA_ZKWC_verify(&priv_key, &priv_mod, &C1, &C2, &ECPX, &c, &E, &proof);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
diff --git a/benchmark/bench_nm_commit.c b/benchmark/bench_nm_commit.c
index 82f7e8c..7b7a356 100644
--- a/benchmark/bench_nm_commit.c
+++ b/benchmark/bench_nm_commit.c
@@ -22,7 +22,7 @@ under the License.
  */
 
 #include "bench.h"
-#include "amcl/commitments.h"
+#include "amcl/nm_commitment.h"
 
 #define MIN_TIME    5.0
 #define MIN_ITERS   10
@@ -60,34 +60,34 @@ int main()
     start=clock();
     do
     {
-        COMMITMENTS_NM_commit(NULL, &X, &R, &C);
+        NM_COMMITMENT_commit(NULL, &X, &R, &C);
         iterations++;
         elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
     }
     while (elapsed<MIN_TIME || iterations<MIN_ITERS);
 
     elapsed= MICROSECOND * elapsed / iterations;
-    printf("\tCOMMITMENTS_NM_commit\t%8d iterations\t",iterations);
+    printf("\tNM_COMMITMENT_commit\t%8d iterations\t",iterations);
     printf("%8.2lf us per iteration\n",elapsed);
 
     iterations = 0;
     start = clock();
     do
     {
-        rc = COMMITMENTS_NM_decommit(&X, &R, &C);
+        rc = NM_COMMITMENT_decommit(&X, &R, &C);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
     while (elapsed < MIN_TIME || iterations < MIN_ITERS);
 
-    if (rc != COMMITMENTS_OK)
+    if (rc != NM_COMMITMENT_OK)
     {
-        printf("FAILURE COMMITMENTS_NM_decommit: %d\n", rc);
+        printf("FAILURE NM_COMMITMENT_decommit: %d\n", rc);
         exit(EXIT_FAILURE);
     }
 
     elapsed = MICROSECOND * elapsed / iterations;
-    printf("\tCOMMITMENTS_NM_decommit\t%8d iterations\t", iterations);
+    printf("\tNM_COMMITMENT_decommit\t%8d iterations\t", iterations);
     printf("%8.2lf us per iteration\n", elapsed);
 
     exit(EXIT_SUCCESS);
diff --git a/examples/example_bc_setup.c b/examples/example_bc_setup.c
index 21b017e..fd1367d 100644
--- a/examples/example_bc_setup.c
+++ b/examples/example_bc_setup.c
@@ -20,20 +20,33 @@ under the License.
 /* NM commitment smoke test */
 
 #include <stdio.h>
-#include "amcl/commitments.h"
+#include "amcl/bit_commitment.h"
 
 char *Phex = "CA5F37B7C0DDF6530B30A41116588218DE95F1F36B807FD7C28E4C467EE3F35967BC01D28B71F8A627A353675A81C86A1FF03DCECAF1686891183FA317BA34A4A1148D40A89F1F3AC0C200511C6CFE02342CD75354C25A2E069886DD4FB73BD365660D163F1282B143119AB8F375A73875EC16B634F52593B73BC6D875F2D3EF";
 char *Qhex = "C2FC545C1C803F6C7625FBC4ECF9355734D6B6058FD714816D3ECFB93F1F705C9CE90D4F8796A05148AB5ABC201F90889231CC6BF5F68ED15EE4D901F603930A280EEABF10C613BFCB67A816363C839EB902B02607EB48AB8325E2B72620D4D294A232803217090DFB50AF8C620D4679E77CE3053437ED518F4F68840DCF1AA3";
 
 int main()
 {
+    int rc;
+
     char p[HFS_2048];
     octet P = {0, sizeof(p), p};
 
     char q[HFS_2048];
     octet Q = {0, sizeof(q), q};
 
-    COMMITMENTS_BC_priv_modulus m;
+    BIT_COMMITMENT_priv priv;
+
+    // Material for proof
+    BIT_COMMITMENT_pub pub;
+
+    BIT_COMMITMENT_setup_proof proof;
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
 
     // Load values
     OCT_fromHex(&P, Phex);
@@ -44,48 +57,71 @@ int main()
     csprng RNG;
     RAND_seed(&RNG, 32, seed);
 
+    // Generate ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     printf("Setup modulus for the Bit Commitment\n");
 
     // Using externally generated primes
     // Set P and Q to null to randomly generate the primes
-    COMMITMENTS_BC_setup(&RNG, &m, &P, &Q, NULL, NULL);
+    BIT_COMMITMENT_setup(&RNG, &priv, &P, &Q, NULL, NULL);
 
     printf("\n\tP      = ");
-    FF_2048_output(m.P, HFLEN_2048);
+    FF_2048_output(priv.mod.p, HFLEN_2048);
     printf("\n\tQ      = ");
-    FF_2048_output(m.Q, HFLEN_2048);
+    FF_2048_output(priv.mod.q, HFLEN_2048);
     printf("\n\tN      = ");
-    FF_2048_output(m.N, FFLEN_2048);
+    FF_2048_output(priv.mod.n, FFLEN_2048);
     printf("\n\tpq     = ");
-    FF_2048_output(m.pq, FFLEN_2048);
+    FF_2048_output(priv.pq, FFLEN_2048);
     printf("\n\tALPHA  = ");
-    FF_2048_output(m.alpha, FFLEN_2048);
+    FF_2048_output(priv.alpha, FFLEN_2048);
     printf("\n\tIALPHA = ");
-    FF_2048_output(m.ialpha, FFLEN_2048);
+    FF_2048_output(priv.ialpha, FFLEN_2048);
     printf("\n\tB0     = ");
-    FF_2048_output(m.b0, FFLEN_2048);
+    FF_2048_output(priv.b0, FFLEN_2048);
     printf("\n\tB1     = ");
-    FF_2048_output(m.b1, FFLEN_2048);
+    FF_2048_output(priv.b1, FFLEN_2048);
+    printf("\n");
+
+    // Prove b0, b1, n are of the correct form
+    printf("\nProve the generated parameters are well formed\n");
+
+    BIT_COMMITMENT_setup_prove(&RNG, &priv, &proof, &ID, &AD);
+    printf("\tProof omitted for briefness\n");
+
+    printf("\nVerify the proof\n");
+    BIT_COMMITMENT_priv_to_pub(&pub, &priv);
+    rc = BIT_COMMITMENT_setup_verify(&pub, &proof, &ID, &AD);
+    if (rc != BIT_COMMITMENT_OK)
+    {
+        printf("\tFailure! RC %d\n", rc);
+    }
+    else
+    {
+        printf("\tSuccess!\n");
+    }
 
-    printf("\n\nClear secret values from the modulus");
-    COMMITMENTS_BC_kill_priv_modulus(&m);
+    printf("\nClear secret values from the modulus");
+    BIT_COMMITMENT_priv_kill(&priv);
 
     printf("\n\tP      = ");
-    FF_2048_output(m.P, HFLEN_2048);
+    FF_2048_output(priv.mod.p, HFLEN_2048);
     printf("\n\tQ      = ");
-    FF_2048_output(m.Q, HFLEN_2048);
+    FF_2048_output(priv.mod.q, HFLEN_2048);
     printf("\n\tN      = ");
-    FF_2048_output(m.N, FFLEN_2048);
+    FF_2048_output(priv.mod.n, FFLEN_2048);
     printf("\n\tpq     = ");
-    FF_2048_output(m.pq, FFLEN_2048);
+    FF_2048_output(priv.pq, FFLEN_2048);
     printf("\n\tALPHA  = ");
-    FF_2048_output(m.alpha, FFLEN_2048);
+    FF_2048_output(priv.alpha, FFLEN_2048);
     printf("\n\tIALPHA = ");
-    FF_2048_output(m.ialpha, FFLEN_2048);
+    FF_2048_output(priv.ialpha, FFLEN_2048);
     printf("\n\tB0     = ");
-    FF_2048_output(m.b0, FFLEN_2048);
+    FF_2048_output(priv.b0, FFLEN_2048);
     printf("\n\tB1     = ");
-    FF_2048_output(m.b1, FFLEN_2048);
+    FF_2048_output(priv.b1, FFLEN_2048);
     printf("\n");
 
     // Clean memory
diff --git a/examples/example_hidden_dlog.c b/examples/example_hidden_dlog.c
new file mode 100644
index 0000000..e985a17
--- /dev/null
+++ b/examples/example_hidden_dlog.c
@@ -0,0 +1,168 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* Example of ZKPoK of DLOG over a hidden order group */
+
+#include "amcl/hidden_dlog.h"
+
+// Safe primes P = 2p+1, Q = 2q+1
+char *Phex  = "e41615620cb68a9ea8df28551b27f333cf65c770c7e959435786d4b510fe360a304fd2bf437431e790dc4c54da6db03119e75ef0b3f47436acf78a9e7b2276ebdd864e49d3bf450c496b10471f024dc4ae1f659c41aacdfb8ee6d52ba46a82d41f79a14277a61474a6473b7e4ab82528383d6400dc71278941e16c138d74d5bb";
+char *Qhex  = "d344c02d8379387e773ab6fa6de6b92b395d5b7f0c41660778766a1ec4740468203bff2d05f263ff6f22740d4b2e799fd1fd2e2339e328c62d31eeecba30fd4892e0c1637e0f62b4de34f5d778a7dfd181b94464f3669751264a0058708a360552535653efc75e3035485e966df30a17146d692747e20b2f04f3877dd1f56dcf";
+
+// B1 = B0 ^ A mod PQ with B0 generator of G_pq
+char *Ahex  = "2545cf613d4a6fa16bec6ec4dfc0c512bb6b8ea31250414f01f466776d30ca080e323392759180cf0e853a9168b59cf32589f84c1380c3a1482c031cb3b32b5e2dc062dde861fe09dd57afb1c2b8674a35dfe016368e2345592fd90e76060532ce61cbec50a49c67c5ab3f3b433aaa8d0480f79123b14a375f6a8f8ebc91cabd8e5fe5428a37f11caee1f7833418d60c2a757304ca1f12e2a63a366e7ec3007a4c62b068b6207aa2ce2ea287fbdeff973f4a725da10df44134a8f981f22157ee932a3b3565ec723af666553c668fcd31cf342712b4dff9bb5e95dc0d6cc23cfb31b9fdd92f00a35a200c2656054bb [...]
+char *B0hex = "5e712c49e4648060d2a1f4487aa56496f75106571e4f6fedebf0150fa628d968e8694919d151e21a521c3e80309e5830b4c284f0e00e084fbac1defffbbf2f4f467b2ba14b7ca796fab4574310bf5afead953bfaf01750f0dd8f771df7bc6cfa64b9a108648d8a180a361f5faa9549a56afae8b2bd0563b5591a20439e0781babb280ab30f2b5b6abe4e35b600403f9e86564197fd7a5da724f3fb265600c619645b50cad7ed2597c189b082a18f641dbbf79c28a75add4915ce0ff19ef229a4d03e11cdc1b37d42df20c25b6cd991ab8b31d82051bcb7c3848ca1eac18cb9bab5eaf36390f90bf7e34aace31279c [...]
+char *B1hex = "199540bcefff1aa1af7d665e5fb401a57a0962004fd0f6c4e7ec1543daf9a57c4e758b7e3bb8e9bb9528699cddd5ae23522decee78a67da3a872e1b2fcbc3be354674fd4c037639da2ace925805471bf960d6679bfdac6b722bd1f607f314e05c2c2b7f5af9d85c49c82a40a91b217806f8e18fc1b3746f380b0512458fc7f81e58a052afadcd9fe448e61ce846ab729344b9c845dd4590888ee25abc695ef04efdd9f02a35e89bb563a68cb54ed8a7fba6de284385b8e065372082b10b00499f62dd522ad51d0a4f44f509876b6b3a9e824e172550ef09f5d07183b6ab87671fda390a5a080f50e88d987c5d0ea6 [...]
+
+int main()
+{
+    int rc;
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+
+    char w[HDLOG_VALUES_SIZE];
+    octet W = {0, sizeof(w), w};
+
+    MODULUS_priv m;
+
+    BIG_1024_58 ord[FFLEN_2048];
+
+    BIG_1024_58 alpha[FFLEN_2048];
+    BIG_1024_58 b0[FFLEN_2048];
+    BIG_1024_58 b1[FFLEN_2048];
+
+    BIG_1024_58 ws1[HFLEN_2048];
+    BIG_1024_58 ws2[HFLEN_2048];
+
+    HDLOG_iter_values r;
+    HDLOG_iter_values rho;
+    HDLOG_iter_values t;
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+
+    // Deterministic RNG for testing
+    char seed[32] = {0};
+    csprng RNG;
+    RAND_seed(&RNG, 32, seed);
+
+    // Pseudorandom ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
+    // Load values
+    OCT_fromHex(&P, Phex);
+    OCT_fromHex(&Q, Qhex);
+
+    MODULUS_fromOctets(&m, &P, &Q);
+
+    OCT_fromHex(&W, B0hex);
+    FF_2048_fromOctet(b0, &W, FFLEN_2048);
+
+    OCT_fromHex(&W, B1hex);
+    FF_2048_fromOctet(b1, &W, FFLEN_2048);
+
+    OCT_fromHex(&W, Ahex);
+    FF_2048_fromOctet(alpha, &W, FFLEN_2048);
+
+    // Compute order of B0
+    FF_2048_copy(ws1, m.p, HFLEN_2048);
+    FF_2048_copy(ws2, m.q, HFLEN_2048);
+
+    FF_2048_shr(ws1, HFLEN_2048);
+    FF_2048_shr(ws2, HFLEN_2048);
+
+    FF_2048_mul(ord, ws1, ws2, HFLEN_2048);
+
+    printf("Prove knowledge of DLOG for\n");
+    printf("\tP       = ");
+    FF_2048_output(m.p, HFLEN_2048);
+    printf("\n\tQ     = ");
+    FF_2048_output(m.q, HFLEN_2048);
+    printf("\n\tN     = ");
+    FF_2048_output(m.n, FFLEN_2048);
+    printf("\n\tALPHA = ");
+    FF_2048_output(alpha, FFLEN_2048);
+    printf("\n\tB0    = ");
+    FF_2048_output(b0, FFLEN_2048);
+    printf("\n\tB1    = ");
+    FF_2048_output(b1, FFLEN_2048);
+    printf("\n");
+
+    // ZK proof
+    printf("\nGenerate proof commitment\n");
+
+    HDLOG_commit(&RNG, &m, ord, b0, r, rho);
+
+    printf("\tR   = ");
+    HDLOG_iter_values_toOctet(&W, r);
+    OCT_output(&W);
+    printf("\tRHO = ");
+    HDLOG_iter_values_toOctet(&W, rho);
+    OCT_output(&W);
+
+    printf("\nGenerate challenge\n");
+
+    HDLOG_challenge(m.n, b0, b1, rho, &ID, &AD, &E);
+
+    printf("\tE = ");
+    OCT_output(&E);
+
+    printf("\nGenerate proof\n");
+
+    HDLOG_prove(ord, alpha, r, &E, t);
+
+    printf("\tT = ");
+    HDLOG_iter_values_toOctet(&W, t);
+    OCT_output(&W);
+
+    printf("\nVerify proof\n");
+
+    rc = HDLOG_verify(m.n, b0, b1, rho, &E, t);
+    if (rc == HDLOG_OK)
+    {
+        printf("\tSuccess!\n");
+    }
+    else
+    {
+        printf("\tFailure!\n");
+    }
+
+    // Clear memory
+    HDLOG_iter_values_kill(r);
+
+    MODULUS_kill(&m);
+    FF_2048_zero(ws1, FFLEN_2048);
+    FF_2048_zero(ws2, FFLEN_2048);
+    FF_2048_zero(ord, FFLEN_2048);
+    FF_2048_zero(alpha, FFLEN_2048);
+
+    OCT_clear(&P);
+    OCT_clear(&Q);
+}
diff --git a/examples/example_nm_commit.c b/examples/example_nm_commit.c
index 6466302..aa52f86 100644
--- a/examples/example_nm_commit.c
+++ b/examples/example_nm_commit.c
@@ -22,7 +22,7 @@ under the License.
  */
 
 #include <stdio.h>
-#include "amcl/commitments.h"
+#include "amcl/nm_commitment.h"
 
 int main()
 {
@@ -47,7 +47,7 @@ int main()
     OCT_output(&X);
 
     printf("\nCompute commitment value C and decommitment value R.\n");
-    COMMITMENTS_NM_commit(&RNG, &X, &R, &C);
+    NM_COMMITMENT_commit(&RNG, &X, &R, &C);
 
     printf("\tR = ");
     OCT_output(&R);
@@ -57,8 +57,8 @@ int main()
     printf("\nTransmit C to commit to the value X.\n");
 
     printf("\nTransmit R, X to decommit the value.\n");
-    rc = COMMITMENTS_NM_decommit(&X, &R, &C);
-    if (rc != COMMITMENTS_OK)
+    rc = NM_COMMITMENT_decommit(&X, &R, &C);
+    if (rc != NM_COMMITMENT_OK)
     {
         printf("\tFailure\n\n");
     }
diff --git a/include/amcl/bit_commitment.h b/include/amcl/bit_commitment.h
new file mode 100644
index 0000000..a008530
--- /dev/null
+++ b/include/amcl/bit_commitment.h
@@ -0,0 +1,384 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file bit_commitment.h
+ * @brief ZKP for Polynomial Relations based on the Bit Commitment
+ *
+ */
+
+#ifndef BIT_COMMITMENT_H
+#define BIT_COMMITMENT_H
+
+#include "amcl/amcl.h"
+#include "amcl/paillier.h"
+#include "amcl/bit_commitment_setup.h"
+#include "amcl/ecp_SECP256K1.h"
+#include "amcl/ecdh_SECP256K1.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* ZKP of knowledge and range of Paillier Ciphertext */
+
+/** \brief Secret random values for the ZKP */
+typedef struct
+{
+    BIG_1024_58 alpha[FFLEN_2048];               /**< Random value in \f$ [0, \ldots, q^3]          \f$ */
+    BIG_1024_58 beta[FFLEN_2048];                /**< Random value in \f$ [0, \ldots, N] \f$ */
+    BIG_1024_58 gamma[FFLEN_2048 + HFLEN_2048];  /**< Random value in \f$ [0, \ldots, \tilde{N}q^3] \f$ */
+    BIG_1024_58 rho[FFLEN_2048 + HFLEN_2048];    /**< Random value in \f$ [0, \ldots, \tilde{N}q]   \f$ */
+} BIT_COMMITMENT_rv;
+
+/** \brief Public commitment for the ZKP */
+typedef struct
+{
+    BIG_1024_58 z[FFLEN_2048];  /**< Commitment to h1, h2, x using rho */
+    BIG_512_60  u[FFLEN_4096];  /**< Commitment for Paillier consistency using beta */
+    BIG_1024_58 w[FFLEN_2048];  /**< Commitment to h1, h2, alpha using gamma */
+} BIT_COMMITMENT_commitment;
+
+/** \brief Proof for the ZKP */
+typedef struct
+{
+    BIG_512_60  s[FFLEN_4096];                /**< Proof of knowledge of the Paillier r value */
+    BIG_1024_58 s1[FFLEN_2048];               /**< Proof of knowledge of x. It must be less than q^3 */
+    BIG_1024_58 s2[FFLEN_2048 + HFLEN_2048];  /**< Auxiliary proof of knowledge for x */
+} BIT_COMMITMENT_proof;
+
+/** \brief Commitment Generation
+ *
+ *  Generate a commitment for the ZKP
+ *
+ *  <ol>
+ *  <li> \f$ \alpha \in_R [0, \ldots, q^3]\f$
+ *  <li> \f$ \beta  \in_R [0, \ldots, N]\f$
+ *  <li> \f$ \gamma \in_R [0, \ldots, q^{3}\tilde{N}]\f$
+ *  <li> \f$ \rho   \in_R [0, \ldots, q\tilde{N}]\f$
+ *  <li> \f$ z = h_1^{x}h_2^{\rho}        \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ u = h_1^{\alpha}h_2^{\gamma} \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ w = g^{\alpha}\beta^{N} \text{ }\mathrm{mod}\text{ }N^2 \f$
+ *  </ol>
+ *
+ *  @param RNG         csprng for random generation
+ *  @param key         Paillier key used to encrypt X
+ *  @param m           Public BC modulus of the verifier
+ *  @param X           Message to prove knowledge and range
+ *  @param rv          Random values associated to the commitment. If RNG is NULL this is read
+ *  @param c           Destination commitment
+ */
+extern void BIT_COMMITMENT_commit(csprng *RNG, PAILLIER_private_key *key, BIT_COMMITMENT_pub *m, octet *X, BIT_COMMITMENT_rv *rv, BIT_COMMITMENT_commitment *c);
+
+/** \brief Proof generation
+ *
+ *  Generate a proof for the ZKP
+ *
+ *  <ol>
+ *  <li> \f$ s  = \beta r^e \text{ }\mathrm{mod}\text{ }N \f$
+ *  <li> \f$ s_1 = ex + \alpha \f$
+ *  <li> \f$ s_2 = e\rho + \gamma \f$
+ *  </ol>
+ *
+ *  @param key         Private Paillier key of the prover
+ *  @param X           Message to prove knowledge and range
+ *  @param R           Random value used in the Paillier encryption of X
+ *  @param rv          Random values associated to the commitment
+ *  @param E           (pseudo)random challenge
+ *  @param p           Destination proof
+ */
+extern void BIT_COMMITMENT_prove(PAILLIER_private_key *key, octet *X, octet *R, BIT_COMMITMENT_rv *rv, octet *E, BIT_COMMITMENT_proof *p);
+
+/** \brief Verify a Proof
+ *
+ *  <ol>
+ *  <li> \f$ s1 \stackrel{?}{\leq} q^3 \f$
+ *  <li> \f$ w \stackrel{?}{=} h_1^{s_1}h_2^{s_2}z^{-e} \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ u \stackrel{?}{=} g^{s_1}s^{N}c^{-e} \text{ }\mathrm{mod}\text{ }N^2 \f$
+ *  </ol>
+ *
+ *  @param key         Public Paillier key of the prover
+ *  @param m           Private BC modulus of the verifier
+ *  @param CT          Encrypted Message to prove knowledge and range
+ *  @param c           Received commitment
+ *  @param E           Generated challenge
+ *  @param p           Received proof
+ *  @return            BIT_COMMITMENT_OK if the proof is valid, BIT_COMMITMENT_FAIL otherwise
+ */
+extern int BIT_COMMITMENT_verify(PAILLIER_public_key *key, BIT_COMMITMENT_priv *m, octet *CT, BIT_COMMITMENT_commitment *c, octet *E, BIT_COMMITMENT_proof *p);
+
+/** \brief Dump the commitment to octets
+ *
+ *  @param Z           Destination Octet for the z component of the commitment. FS_2048 long
+ *  @param U           Destination Octet for the u component of the commitment. FS_4096 long
+ *  @param W           Destination Octet for the w component of the commitment. FS_2048 long
+ *  @param c           Commitment to export
+ */
+extern void BIT_COMMITMENT_commitment_toOctets(octet *Z, octet *U, octet *W, BIT_COMMITMENT_commitment *c);
+
+/** \brief Read the commitments from octets
+ *
+ *  @param c           Destination commitment
+ *  @param Z           Octet with the z component of the proof
+ *  @param U           Octet with the u component of the proof
+ *  @param W           Octet with the w component of the proof
+ */
+extern void BIT_COMMITMENT_commitment_fromOctets(BIT_COMMITMENT_commitment *c, octet *Z, octet *U, octet *W);
+
+/** \brief Dump the proof to octets
+ *
+ *  @param S           Destination Octet for the s component of the proof. FS_2048 long
+ *  @param S1          Destination Octet for the s1 component of the proof. HFS_2048 long
+ *  @param S2          Destination Octet for the s2 component of the proof. FS_2048 + HFS_2048 long
+ *  @param p           Proof to export
+ */
+extern void BIT_COMMITMENT_proof_toOctets(octet *S, octet *S1, octet *S2, BIT_COMMITMENT_proof *p);
+
+/** \brief Read the proof from octets
+ *
+ *  @param p           Destination proof
+ *  @param S           Octet with the s component of the proof
+ *  @param S1          Octet with the s1 component of the proof
+ *  @param S2          Octet with the s2 component of the proof
+ */
+extern void BIT_COMMITMENT_proof_fromOctets(BIT_COMMITMENT_proof *p, octet *S, octet *S1, octet *S2);
+
+/** \brief Clean the memory containing the random values
+ *
+ *   @param rv         Random values to clean
+ */
+extern void BIT_COMMITMENT_rv_kill(BIT_COMMITMENT_rv *rv);
+
+
+/* ZKP of Knowledge and range of Paillier homomorphic mul/add */
+
+/** \brief Secret random values for the muladd ZKP */
+typedef struct
+{
+    BIG_1024_58 alpha[FFLEN_2048];              /**< Random value in \f$ [0, \ldots, q^3]          \f$ */
+    BIG_1024_58 beta[FFLEN_2048];               /**< Random value in \f$ [0, \ldots, N]            \f$ */
+    BIG_1024_58 gamma[FFLEN_2048];              /**< Random value in \f$ [0, \ldots, N]            \f$ */
+    BIG_1024_58 rho[FFLEN_2048 + HFLEN_2048];   /**< Random value in \f$ [0, \ldots, \tilde{N}q]   \f$ */
+    BIG_1024_58 rho1[FFLEN_2048 + HFLEN_2048];  /**< Random value in \f$ [0, \ldots, \tilde{N}q^3] \f$ */
+    BIG_1024_58 sigma[FFLEN_2048 + HFLEN_2048]; /**< Random value in \f$ [0, \ldots, \tilde{N}q]   \f$ */
+    BIG_1024_58 tau[FFLEN_2048 + HFLEN_2048];   /**< Random value in \f$ [0, \ldots, \tilde{N}q]   \f$ */
+} BIT_COMMITMENT_muladd_rv;
+
+/** \brief Public commitment for the muladd ZKP */
+typedef struct
+{
+    BIG_1024_58 z[FFLEN_2048];      /**< Commitment to h1, h2, x using rho */
+    BIG_1024_58 z1[FFLEN_2048];     /**< Auxiliary Commitment to h1, h2, binding alpha and rho1 */
+    BIG_1024_58 t[FFLEN_2048];      /**< Commitment to h1, h2, y using sigma */
+    BIG_1024_58 v[2 * FFLEN_2048];  /**< Commitment to paillier PK and c1 using alpha and gamma */
+    BIG_1024_58 w[FFLEN_2048];      /**< Auxiliary Commitment to h1, h2, binding gamma and tau */
+} BIT_COMMITMENT_muladd_commitment;
+
+/** \brief Proof for the muladd ZKP */
+typedef struct
+{
+    BIG_1024_58 s[FFLEN_2048];                /**< Proof of knowledge of the Paillier r value */
+    BIG_1024_58 s1[FFLEN_2048];               /**< Proof of knowledge of x. It must be less than q^3 */
+    BIG_1024_58 s2[FFLEN_2048 + HFLEN_2048];  /**< Auxiliary proof of knowledge for x */
+    BIG_1024_58 t1[FFLEN_2048];               /**< Proof of knowledge of y */
+    BIG_1024_58 t2[FFLEN_2048 + HFLEN_2048];  /**< Auxiliary proof of knowledge for y */
+} BIT_COMMITMENT_muladd_proof;
+
+/** \brief Commitment Generation
+ *
+ *  Generate a commitment for the ZKP
+ *
+ *  <ol>
+ *  <li> \f$ \alpha \in_R [0, \ldots, q^3]\f$
+ *  <li> \f$ \beta  \in_R [0, \ldots, N]\f$
+ *  <li> \f$ \gamma \in_R [0, \ldots, N]\f$
+ *  <li> \f$ \rho   \in_R [0, \ldots, q\tilde{N}]\f$
+ *  <li> \f$ \rho_1 \in_R [0, \ldots, q^{3}\tilde{N}]\f$
+ *  <li> \f$ \sigma \in_R [0, \ldots, q\tilde{N}]\f$
+ *  <li> \f$ \tau   \in_R [0, \ldots, q\tilde{N}]\f$
+ *  <li> \f$ z  = h_1^{x}h_2^{\rho}              \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ z_1 = h_1^{\alpha}h_2^{\rho_1}       \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ t  = h_1^{y}h_2^{\sigma}            \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ w  = h_1^{\gamma}h_2^{\tau}         \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ v  = c1^{\alpha}g^{\gamma}\beta^{N} \text{ }\mathrm{mod}\text{ }N^2 \f$
+ *  </ol>
+ *
+ *  @param RNG         csprng for random generation
+ *  @param key         Paillier key used to encrypt C1
+ *  @param m           Public BC modulus of the verifier
+ *  @param X           Homomorphically multiplied PT
+ *  @param Y           Homomorphically added PT
+ *  @param C1          Base Paillier Ciphertext
+ *  @param rv          Random values associated to the commitment. If RNG is NULL this is read
+ *  @param c           Destination commitment
+ */
+extern void BIT_COMMITMENT_muladd_commit(csprng *RNG, PAILLIER_public_key *key, BIT_COMMITMENT_pub *m, octet *X, octet *Y, octet *C1, BIT_COMMITMENT_muladd_rv *rv, BIT_COMMITMENT_muladd_commitment *c);
+
+/** \brief Proof generation
+ *
+ *  Generate a proof for the ZKP
+ *
+ *  <ol>
+ *  <li> \f$ s  = \beta r^e \text{ }\mathrm{mod}\text{ }N \f$
+ *  <li> \f$ s_1 = ex + \alpha \f$
+ *  <li> \f$ s_2 = e\rho + \rho_1 \f$
+ *  <li> \f$ t_1 = ey + \gamma \f$
+ *  <li> \f$ t_2 = e\sigma + \tau \f$
+ *  </ol>
+ *
+ *  @param key         Public Paillier key used for the homomorphic operations
+ *  @param X           Homomorphically multiplied PT
+ *  @param Y           Homomorphically added PT
+ *  @param R           Random value used in the Paillier addition
+ *  @param rv          Random values associated to the commitment
+ *  @param E           Generated challenge
+ *  @param p           Destination proof
+ */
+extern void BIT_COMMITMENT_muladd_prove(PAILLIER_public_key *key, octet *X, octet *Y, octet *R, BIT_COMMITMENT_muladd_rv *rv, octet *E, BIT_COMMITMENT_muladd_proof *p);
+
+/** \brief Verify a proof
+ *
+ *  <ol>
+ *  <li> \f$ s_1 \stackrel{?}{\leq} q^3 \f$
+ *  <li> \f$ z_1 \stackrel{?}{=} h_1^{s_1}h_2^{s_2}z^{-e}    \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ w  \stackrel{?}{=} h_1^{t_1}h_2^{t_2}t^{-e}    \text{ }\mathrm{mod}\text{ }\tilde{N} \f$
+ *  <li> \f$ v  \stackrel{?}{=} c1^{s_1}s^{N}g^{t_1}c2^{-e} \text{ }\mathrm{mod}\text{ }N^2 \f$
+ *  </ol>
+ *
+ *  @param key         Private Paillier Key used for the homomorphic operations
+ *  @param m         Private BC modulus of the verifier
+ *  @param C1          Base Paillier Ciphertext
+ *  @param C2          New Paillier Ciphertext to prove knowledge and range
+ *  @param c           Received commitment
+ *  @param E           Generated challenge
+ *  @param p           Received proof
+ *  @return            BIT_COMMITMENT_OK if the proof is valid, BIT_COMMITMENT_FAIL otherwise
+ */
+extern int BIT_COMMITMENT_muladd_verify(PAILLIER_private_key *key, BIT_COMMITMENT_priv *m, octet *C1, octet *C2, BIT_COMMITMENT_muladd_commitment *c, octet *E, BIT_COMMITMENT_muladd_proof *p);
+
+/** \brief Dump the commitment to octets
+ *
+ *  @param Z           Destination Octet for the z component of the commitment. FS_2048 long
+ *  @param Z1          Destination Octet for the z1 component of the commitment. FS_2048 long
+ *  @param T           Destination Octet for the t component of the commitment. FS_2048 long
+ *  @param V           Destination Octet for the v component of the commitment. FS_4096 long
+ *  @param W           Destination Octet for the w component of the commitment. FS_2048 long
+ *  @param c           Commitment to export
+ */
+extern void BIT_COMMITMENT_muladd_commitment_toOctets(octet *Z, octet *Z1, octet *T, octet *V, octet *W, BIT_COMMITMENT_muladd_commitment *c);
+
+/** \brief Read the commitments from octets
+ *
+ *  @param c           Destination commitment
+ *  @param Z           Destination Octet for the z component of the commitment. FS_2048 long
+ *  @param Z1          Destination Octet for the z1 component of the commitment. FS_2048 long
+ *  @param T           Destination Octet for the t component of the commitment. FS_2048 long
+ *  @param V           Destination Octet for the v component of the commitment. FS_4096 long
+ *  @param W           Destination Octet for the w component of the commitment. FS_2048 long
+ */
+extern void BIT_COMMITMENT_muladd_commitment_fromOctets(BIT_COMMITMENT_muladd_commitment *c, octet *Z, octet *Z1, octet *T, octet *V, octet *W);
+
+/** \brief Dump the proof to octets
+ *
+ *  @param S           Destination Octet for the s component of the proof. FS_2048 long
+ *  @param S1          Destination Octet for the s1 component of the proof. HFS_2048 long
+ *  @param S2          Destination Octet for the s2 component of the proof. FS_2048 + HFS_2048 long
+ *  @param T1          Destination Octet for the t1 component of the proof. FS_2048 long
+ *  @param T2          Destination Octet for the t2 component of the proof. FS_2048 + HFS_2048 long
+ *  @param p           Proof to export
+ */
+extern void BIT_COMMITMENT_muladd_proof_toOctets(octet *S, octet *S1, octet *S2, octet *T1, octet *T2, BIT_COMMITMENT_muladd_proof *p);
+
+/** \brief Read the proof from octets
+ *
+ *  @param p           Destination proof
+ *  @param S           Octet with the s component of the proof
+ *  @param S1          Octet with the s1 component of the proof
+ *  @param S2          Octet with the s2 component of the proof
+ *  @param T1          Octet with the t1 component of the proof
+ *  @param T2          Octet with the t2 component of the proof
+ */
+extern void BIT_COMMITMENT_muladd_proof_fromOctets(BIT_COMMITMENT_muladd_proof *p, octet *S, octet *S1, octet *S2, octet *T1, octet *T2);
+
+/** \brief Clean the memory containing the random values
+ *
+ *   @param rv         Random values to clean
+ */
+extern void BIT_COMMITMENT_muladd_rv_kill(BIT_COMMITMENT_muladd_rv *rv);
+
+
+/* Additional ZKP of knowledge of DLOG for Paillier Plaintext */
+
+/** \brief Compute additional commitment for DLOG ZKP
+ *
+ *  <ol>
+ *  <li> \f$ G = \alpha.G \f$
+ *  </ol>
+ *
+ *   @param G           ECP, base of the DLOG. On output \f$ \alpha.G \f$
+ *   @param alpha       alpha value from the base ZKP random values
+ */
+extern void BIT_COMMITMENT_ECP_commit(ECP_SECP256K1 *G, BIG_1024_58 *alpha);
+
+/** \brief Verify additional ZKP of knowledge of DLOG
+ *
+ *  <ol>
+ *  <li> \f$ U \stackrel{?}{=} s_1.G - e.X \f$
+ *  </ol>
+ *
+ *   @param G           ECP, base of the DLOG
+ *   @param X           ECP, public DLOG
+ *   @param U           ECP, commitment for the proof
+ *   @param E           Generated challenge
+ *   @param s1          s1 value from the base ZKP
+ *   @return            BIT_COMMITMENT_OK or an error code
+ */
+extern int BIT_COMMITMENT_ECP_verify(ECP_SECP256K1 *G, ECP_SECP256K1 *X, ECP_SECP256K1 *U, octet *E, BIG_1024_58 *s1);
+
+
+/* Helpers to hash parameters and commitments for pseudorandom challenges */
+
+/** \brief Feed the ZKP base parameters into a sha instance
+ *
+ *   @param sha        Destination sha instance
+ *   @param key        Paillier Public Key used for encryption
+ *   @param m          Bit Commitment modulus used for the ZKP
+ */
+extern void BIT_COMMITMENT_hash_params(hash256 *sha, PAILLIER_public_key *key, BIT_COMMITMENT_pub *m);
+
+/** \brief Feed the plaintext ZKP commitment into a sha instance
+ *
+ *   @param sha        Destination sha instance
+ *   @param c          Commitment for the ZKP
+ */
+extern void BIT_COMMITMENT_hash_commitment(hash256 *sha, BIT_COMMITMENT_commitment *c);
+
+/** \brief Feed the muladd ZKP commitment into a sha instance
+ *
+ *   @param sha        Destination sha instance
+ *   @param c          Commitment for the ZKP
+ */
+extern void BIT_COMMITMENT_hash_muladd_commitment(hash256 *sha, BIT_COMMITMENT_muladd_commitment *c);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/amcl/bit_commitment_setup.h b/include/amcl/bit_commitment_setup.h
new file mode 100644
index 0000000..04587fe
--- /dev/null
+++ b/include/amcl/bit_commitment_setup.h
@@ -0,0 +1,198 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file bit_commitment_setup.h
+ * @brief Commitment schemes declarations
+ *
+ */
+
+#ifndef BIT_COMMITMENT_SETUP_H
+#define BIT_COMMITMENT_SETUP_H
+
+#include "amcl/amcl.h"
+#include "amcl/modulus.h"
+#include "amcl/hidden_dlog.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define BIT_COMMITMENT_OK   0              /**< Success */
+#define BIT_COMMITMENT_FAIL 121            /**< Invalid Commitment */
+#define BIT_COMMITMENT_INVALID_PROOF 122   /**< The Proof of well formednes is invalid */
+#define BIT_COMMITMENT_INVALID_FORMAT 123  /**< An octet value has an invalid format */
+
+
+/* Bit Commitment Setup API */
+
+/*! \brief Private values and modulus for Bit Commitment */
+typedef struct
+{
+    MODULUS_priv mod;               /**< Modulus N=PQ, P=2p+1, Q=2q+1 */
+    BIG_1024_58 pq[FFLEN_2048];     /**< Precomputed product of p and q */
+    BIG_1024_58 alpha[FFLEN_2048];  /**< Secret exponent of the DLOG b1 = b0^alpha*/
+    BIG_1024_58 ialpha[FFLEN_2048]; /**< Inverse of alpha mod pq. Secret exponent of the DLOG b0 = b1^ialpha */
+    BIG_1024_58 b0[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
+    BIG_1024_58 b1[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
+} BIT_COMMITMENT_priv;
+
+/*! \brief Public values and modulus for Bit Commitment */
+typedef struct
+{
+    BIG_1024_58 N[FFLEN_2048];      /**< Modulus */
+    BIG_1024_58 b0[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
+    BIG_1024_58 b1[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
+} BIT_COMMITMENT_pub;
+
+/*! \brief Set up an RSA modulus and the necessary values for the BC.
+ *
+ * Generates an RSA modulus PQ using Safe Primes P = 2p+1 and Q=2q+1
+ * It then computes a generator b0 of G_pq as subgroup of Z/PQZ and
+ * an exponent alpha coprime with phi(pq) and uses it to compute a
+ * second generator b1 = b0^alpha of G_pq
+ *
+ * RNG is only used to generate the values not explicitly specified.
+ * This allows using safe primes P and Q generated externally while
+ * still randomly generating B0 and ALPHA. In turn, this allows the
+ * user to generate P and Q with ad hoc libraries for the generation of
+ * primes instead of the (slow) safe prime generation utility included
+ * here.
+ *
+ * @param RNG   CSPRNG to generate P, Q, B0 and ALPHA
+ * @param m     Private modulus to populate
+ * @param P     Safe prime 2p+1. Generated if NULL
+ * @param Q     Safe prime 2q+1. Generated if NULL
+ * @param B0    Generator of G_pq as subgroup of Z/PQZ. Generated if NULL
+ * @param ALPHA DLOG exponent for B1 = B0^ALPHA. Generated if NULL
+ */
+extern void BIT_COMMITMENT_setup(csprng *RNG, BIT_COMMITMENT_priv *m, octet *P, octet *Q, octet *B0, octet *ALPHA);
+
+/*! \brief Import a modulus from octets
+ *
+ * @param m     The destination modulus
+ * @param P     The first factor of the modulus
+ * @param Q     The second factor of the modulus
+ * @param B0    Generator of the subgroup for the Bit Commitment
+ * @param ALPHA Secret exponent use to compute the second generator
+ */
+extern void BIT_COMMITMENT_priv_fromOctets(BIT_COMMITMENT_priv *m, octet *P, octet *Q, octet *B0, octet * ALPHA);
+
+/*! \brief Export a modulus to octets
+ *
+ * @param P     The first factor of the modulus
+ * @param Q     The second factor of the modulus
+ * @param B0    Generator of the subgroup for the Bit Commitment
+ * @param ALPHA Secret exponent use to compute the second generator
+ * @param m     The source modulus
+ */
+extern void BIT_COMMITMENT_priv_toOctets(octet *P, octet *Q, octet *B0, octet * ALPHA, BIT_COMMITMENT_priv *m);
+
+/*! \brief Clean secret values from the modulus
+ *
+ * @param m     The modulus to clean
+ */
+extern void BIT_COMMITMENT_priv_kill(BIT_COMMITMENT_priv *m);
+
+/*! \brief Export the public part of the modulus
+ *
+ * @param pub   The destination public modulus
+ * @param priv  The source private modulus
+ */
+extern void BIT_COMMITMENT_priv_to_pub(BIT_COMMITMENT_pub *pub, BIT_COMMITMENT_priv *priv);
+
+/*! \brief Import a modulus from octets
+ *
+ * @param m     The destination modulus
+ * @param N     The public modulus
+ * @param B0    First generator of the subgroup for the Bit Commitment
+ * @param B1    Second generator of the subgroup for the Bit Commitment
+ */
+extern void BIT_COMMITMENT_pub_fromOctets(BIT_COMMITMENT_pub *m, octet *N, octet *B0, octet *B1);
+
+/*! \brief Export a modulus to octets
+ *
+ * @param N     The public modulus
+ * @param B0    First generator of the subgroup for the Bit Commitment
+ * @param B1    Second generator of the subgroup for the Bit Commitment
+ * @param m     The source modulus
+ */
+extern void BIT_COMMITMENT_pub_toOctets(octet *N, octet *B0, octet *B1, BIT_COMMITMENT_pub *m);
+
+
+/* Bit Commitment Setup ZKP of well formedness API */
+
+/*! \brief Proof of well-fromedness of the Bit Setup parameters */
+typedef struct
+{
+    HDLOG_iter_values rho;          /**< BIT_Commitment for the h1 DLOG ZKP */
+    HDLOG_iter_values irho;         /**< BIT_Commitment for the h0 DLOG ZKP */
+    HDLOG_iter_values t;            /**< Proofs for the h1 DLOG ZKP */
+    HDLOG_iter_values it;           /**< Proofs for the h1 DLOG ZKP */
+} BIT_COMMITMENT_setup_proof;
+
+/*! \brief Prove the well formedness of a Bit Commitment setup
+ *
+ * @param RNG   Cryptographically secure PRNG
+ * @param m     Bit Commitment modulus
+ * @param p     Destination proof of well formedness. If RNG is NULL, then rho and irho are used as r and ir in the commitment
+ * @param ID    Prover unique identifier
+ * @param AD    Additional data to bind in the proof - Optional
+ */
+extern void BIT_COMMITMENT_setup_prove(csprng *RNG, BIT_COMMITMENT_priv *m, BIT_COMMITMENT_setup_proof *p, octet *ID, octet *AD);
+
+/*! \brief Verify the well formedness of a Bit Commitment setup
+ *
+ * @param m     Bit Commitment modulus
+ * @param p     Proof of well formedness
+ * @param ID    Prover unique identifier
+ * @param AD    Additional data to bind in the proof - Optional
+ *
+ * @return      BIT_COMMITMENT_OK if the proof is valid or an error code
+ */
+extern int BIT_COMMITMENT_setup_verify(BIT_COMMITMENT_pub *m, BIT_COMMITMENT_setup_proof *p, octet *ID, octet *AD);
+
+/*! \brief Import a proof of well formedness from octets
+ *
+ * @param p     The destination proof
+ * @param RHO   Commitment for the ZKPoK of DLOG of B1
+ * @param IRHO  Commitment for the ZKPoK of DLOG of B0
+ * @param T     Proof for the ZKPoK of DLOG of B1
+ * @param IT    Proof for the ZKPoK of DLOG of B0
+ *
+ * @return      BIT_COMMITMENT_OK or an error code
+ */
+extern int BIT_COMMITMENT_setup_proof_fromOctets(BIT_COMMITMENT_setup_proof *p, octet *RHO, octet *IRHO, octet *T, octet *IT);
+
+/*! \brief Export a modulus to octets
+ *
+ * @param RHO   Commitment for the ZKPoK of DLOG of B1
+ * @param IRHO  Commitment for the ZKPoK of DLOG of B0
+ * @param T     Proof for the ZKPoK of DLOG of B1
+ * @param IT    Proof for the ZKPoK of DLOG of B0
+ * @param p     The source proof
+ */
+extern void BIT_COMMITMENT_setup_proof_toOctets(octet *RHO, octet *IRHO, octet *T, octet *IT, BIT_COMMITMENT_setup_proof *p);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/amcl/commitments.h b/include/amcl/commitments.h
deleted file mode 100644
index f7bf607..0000000
--- a/include/amcl/commitments.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/**
- * @file commitments.h
- * @brief Commitment schemes declarations
- *
- */
-
-#ifndef COMMITMENTS_H
-#define COMMITMENTS_H
-
-#include "amcl/amcl.h"
-#include "amcl/ff_2048.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define COMMITMENTS_OK   0   /**< Success */
-#define COMMITMENTS_FAIL 81  /**< Invalid Commitment */
-
-/* NM Commitment Scheme API */
-
-/*! \brief Generate a commitment for the value X
- *
- * @param RNG   CSPRNG to use for commitment
- * @param X     Value to commit to
- * @param R     Decommitment value. If RNG is null then this value is read and must be 256 bit long
- * @param C     Commitment value
- */
-extern void COMMITMENTS_NM_commit(csprng *RNG, const octet *X, octet *R, octet *C);
-
-/*! \brief Decommit the value X
- *
- * @param X     Committed value
- * @param R     Decommitment value. Must be 256 bit long
- * @param C     Commitment value
- * @return      Returns 1 for a valid decommitment, 0 otherwise
- */
-extern int COMMITMENTS_NM_decommit(const octet* X, const octet* R, octet* C);
-
-/* Bit Commitment Setup API */
-
-#ifndef FS_2048
-#define FS_2048 MODBYTES_1024_58 * FFLEN_2048  /**< 2048 field size in bytes */
-#endif
-#ifndef HFS_2048
-#define HFS_2048 MODBYTES_1024_58 * HFLEN_2048 /**< Half 2048 field size in bytes */
-#endif
-
-/*! \brief RSA modulus for Bit Commitment */
-typedef struct
-{
-    BIG_1024_58 P[HFLEN_2048];      /**< Safe prime P = 2p+1 */
-    BIG_1024_58 Q[HFLEN_2048];      /**< Safe prime Q = 2q+1 */
-    BIG_1024_58 invPQ[HFLEN_2048];  /**< Precomputed P^(-1) mod Q */
-    BIG_1024_58 pq[FFLEN_2048];     /**< Precomputed product of p and q */
-    BIG_1024_58 N[FFLEN_2048];      /**< Public part of the modulus */
-    BIG_1024_58 alpha[FFLEN_2048];  /**< Secret exponent of the DLOG b1 = b0^alpha*/
-    BIG_1024_58 ialpha[FFLEN_2048]; /**< Inverse of alpha mod pq. Secret exponent of the DLOG b0 = b1^ialpha */
-    BIG_1024_58 b0[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
-    BIG_1024_58 b1[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
-} COMMITMENTS_BC_priv_modulus;
-
-/*! \brief Public RSA modulus for Bit Commitment */
-typedef struct
-{
-    BIG_1024_58 N[FFLEN_2048];      /**< Modulus */
-    BIG_1024_58 b0[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
-    BIG_1024_58 b1[FFLEN_2048];     /**< Generator of G_pq as subgroup of Z/PQZ */
-} COMMITMENTS_BC_pub_modulus;
-
-/*! \brief Set up an RSA modulus and the necessary values.
- *
- * RNG is only used to generate the values not explicitly specified.
- * This allows using safe primes P and Q generated externally while
- * still randomly generating B0 and ALPHA. In turn, this allows the
- * user to generate P and Q with ad hoc libraries for the generation of
- * primes instead of the (slow) safe prime generation utility included
- * here.
- *
- * @param RNG   CSPRNG to generate P, Q, B0 and ALPHA
- * @param m     Private modulus to populate
- * @param P     Safe prime 2p+1. Generated if NULL
- * @param Q     Safe prime 2q+1. Generated if NULL
- * @param B0    Generator of G_pq as subgroup of Z/PQZ. Generated if NULL
- * @param ALPHA DLOG exponent for B1 = B0^ALPHA. Generated if NULL
- */
-extern void COMMITMENTS_BC_setup(csprng *RNG, COMMITMENTS_BC_priv_modulus *m, octet *P, octet *Q, octet *B0, octet *ALPHA);
-
-/*! \brief Clean secret values from the modulus
- *
- * @param m     The modulus to clean
- */
-extern void COMMITMENTS_BC_kill_priv_modulus(COMMITMENTS_BC_priv_modulus *m);
-
-/*! \brief Export the public part of the modulus
- *
- * @param pub   The destination public modulus
- * @param priv  The source private modulus
- */
-extern void COMMITMENTS_BC_export_public_modulus(COMMITMENTS_BC_pub_modulus *pub, COMMITMENTS_BC_priv_modulus *priv);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/include/amcl/hash_utils.h b/include/amcl/hash_utils.h
new file mode 100644
index 0000000..330caeb
--- /dev/null
+++ b/include/amcl/hash_utils.h
@@ -0,0 +1,92 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file hash_utils.h
+ * @brief Hash utility functions for pseudorandom challenge generation
+ *
+ */
+
+#ifndef HASH_UTILS
+#define HASH_UTILS
+
+#include "amcl/amcl.h"
+#include "amcl/big_256_56.h"
+#include "amcl/modulus.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/** \brief Copy the internal state of an hash function
+ *
+ *  @param  dst         Destination hash function. It does not need to be initialised
+ *  @param  src         Source hash function
+ */
+extern void HASH_UTILS_hash_copy(hash256 *dst, const hash256 *src);
+
+/** \brief Process an octet into an hash function
+ *
+ *  @param  sha         Hash function. Must be initialised
+ *  @param  O           Octet to process
+ */
+extern void HASH_UTILS_hash_oct(hash256 *sha, const octet *O);
+
+/** \brief Process a 4 bytes integer into an hash function
+ *
+ *  Convert i as a 4 bytes integer using PKCS#1 I2OSP [RFC2437 # Section 4.1]
+ *  Process the resulting bytes into the provided hash function
+ *
+ *  @param  sha         Hash function. Must be initialised
+ *  @param  i           Integer to process
+ */
+extern void HASH_UTILS_hash_i2osp4(hash256 *sha, const int i);
+
+/** \brief Sample a pseudorandom FF_2048 from a given hash function
+ *
+ *  Use the provided function to produce 4096 pseudorandom bits
+ *  using PKCS#1 MGF1 [RFC2437 # Section 10.2.1]
+ *  Reduce the resulting integer moduls an FF_2048 element.
+ *  The extra random data is produced to make the bias in the
+ *  resulting distribution negligible.
+ *
+ *  @param  sha         Hash function. Must be initialised
+ *  @param  n           Modulo for the reduction. FF_2048 element.
+ *  @param  x           Sampled FF_2048 element
+ */
+extern void HASH_UTILS_sample_mod_FF(hash256 *sha, BIG_1024_58 *n, BIG_1024_58 *x);
+
+/** \brief Sample a pseudorandom FP_256 from a given hash function
+ *
+ *  Produce 256 bit of pseudorandom dqata using the hash function
+ *  Reduce the resulting integer moduls an FP_256 element.
+ *  The integer is sampled using rejection sampling to remove bias.
+ *
+ *  @param  sha         Hash function. Must be initialised
+ *  @param  q           Modulo for the reduction. FP_256 element.
+ *  @param  x           Sampled FP_256 element
+ */
+extern void HASH_UTILS_rejection_sample_mod_BIG(hash256 *sha, BIG_256_56 q, BIG_256_56 x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/amcl/hidden_dlog.h b/include/amcl/hidden_dlog.h
new file mode 100644
index 0000000..d2d8faf
--- /dev/null
+++ b/include/amcl/hidden_dlog.h
@@ -0,0 +1,120 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file hidden_dlog.h
+ * @brief Declarations for ZKPoK of a DLOG in a hidden order group
+ *
+ */
+
+#ifndef HDLOG
+#define HDLOG
+
+#include "amcl/amcl.h"
+#include "amcl/modulus.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define HDLOG_OK             0    /**< Success */
+#define HDLOG_FAIL           101  /**< Invalid Proof */
+#define HDLOG_INVALID_VALUES 102  /**< Invalid encoding for the iterations values */
+
+#define HDLOG_PROOF_ITERS 128                         /**< Iterations necessary for the Proof */
+#define HDLOG_CHALLENGE_SIZE HDLOG_PROOF_ITERS / 8    /**< Length of the challenge necessary for the chosen Proof iterations */
+#define HDLOG_VALUES_SIZE HDLOG_PROOF_ITERS * FS_2048 /**< Length of the values encoding */
+
+/*! \brief Holds the values for each iteration of the protocol */
+typedef BIG_1024_58 HDLOG_iter_values[HDLOG_PROOF_ITERS][FFLEN_2048];
+
+/*! \brief Generate a commitment for the ZKPs
+ *
+ * @param RNG   CSPRNG
+ * @param m     Private modulus (necessary to speed up computations)
+ * @param ord   Order of B0
+ * @param B0    Base of the DLOG
+ * @param R     Random value used in the commitment. If RNG is NULL this is read
+ * @param RHO   Commitment of the ZKP
+ */
+extern void HDLOG_commit(csprng *RNG, MODULUS_priv *m, BIG_1024_58 *ord, BIG_1024_58 *B0, HDLOG_iter_values R, HDLOG_iter_values RHO);
+
+/*! \brief Generate a challenge
+ *
+ * @param N     Public Modulus
+ * @param B0    Base of the DLOG
+ * @param B1    Public Value of the DLOG
+ * @param RHO   Commitment of the ZKP
+ * @param ID    Prover unique identifier
+ * @param AD    Additional data to bind in the proof - Optional
+ * @param E     Generated challenge for the ZKP
+ */
+extern void HDLOG_challenge(BIG_1024_58 *N, BIG_1024_58 *B0, BIG_1024_58 *B1, HDLOG_iter_values RHO, const octet *ID, const octet *AD, octet *E);
+
+/*! \brief Prove knowledge of the DLOG
+ *
+ * @param ord   Order of B0
+ * @param alpha Exponent of the DLOG
+ * @param R     Random value used in the commitment
+ * @param E     Challenge of the ZKP
+ * @param T     Proof of the ZKP
+ */
+extern void HDLOG_prove(BIG_1024_58 *ord, BIG_1024_58 *alpha, HDLOG_iter_values R, octet *E, HDLOG_iter_values T);
+
+/*! \brief Verify the ZKP that the modulus is well formed
+ *
+ * @param N     Public Modulus
+ * @param B0    Base of the DLOG
+ * @param B1    Public Value of the DLOG
+ * @param RHO   Commitment of the ZKP
+ * @param E     Challenge of the ZKP
+ * @param T     Proof of the ZKP
+ *
+ * @return      Returns HDLOG_OK if the proof is valid or an error code
+ */
+extern int HDLOG_verify(BIG_1024_58 *N, BIG_1024_58 *B0, BIG_1024_58 *B1, HDLOG_iter_values RHO, octet *E, HDLOG_iter_values T);
+
+/*! \brief Encode v into an octet
+ *
+ * @param O      Destination Octet
+ * @param v      Source value
+ */
+extern void HDLOG_iter_values_toOctet(octet *O, HDLOG_iter_values v);
+
+/*! \brief Decode an octet into a
+ *
+ * @param v      Destination values
+ * @param O      Source Octet
+ *
+ * @return       HDLOG_OK if the octet is valid or an error code
+ */
+extern int HDLOG_iter_values_fromOctet(HDLOG_iter_values v, octet *O);
+
+/*! \brief Clean the values from v
+ *
+ * @param v      The values to clean
+ */
+extern void HDLOG_iter_values_kill(HDLOG_iter_values v);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/amcl/modulus.h b/include/amcl/modulus.h
new file mode 100644
index 0000000..4d2371e
--- /dev/null
+++ b/include/amcl/modulus.h
@@ -0,0 +1,81 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file modulus.h
+ * @brief Declarations for a modulus N = PQ
+ *
+ */
+
+#ifndef MODULUS_H
+#define MODULUS_H
+
+#include "amcl/amcl.h"
+#include "amcl/big_1024_58.h"
+#include "amcl/ff_2048.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifndef FS_2048
+#define FS_2048 MODBYTES_1024_58 * FFLEN_2048  /**< 2048 field size in bytes */
+#endif
+
+#ifndef HFS_2048
+#define HFS_2048 MODBYTES_1024_58 * HFLEN_2048 /**< Half 2048 field size in bytes */
+#endif
+
+/*! \brief Modulus and precomputed values for CRT */
+typedef struct
+{
+    BIG_1024_58 p[HFLEN_2048];     /**< First factor of the modulus */
+    BIG_1024_58 q[HFLEN_2048];     /**< Second factor of the modulus */
+    BIG_1024_58 invpq[HFLEN_2048]; /**< Precomputed inverse for CRT */
+    BIG_1024_58 n[FFLEN_2048];     /**< Modulus */
+} MODULUS_priv;
+
+/** \brief Read a modulus from octets
+ *
+ *  @param  m           The destination modulus
+ *  @param  P           The first factor of the modulus
+ *  @param  Q           The second factor of the modulus
+ */
+void MODULUS_fromOctets(MODULUS_priv *m, octet *P, octet *Q);
+
+/** \brief Write a modulus to octets
+ *
+ *  @param  P           The destination first factor of the modulus
+ *  @param  Q           The destination second factor of the modulus
+ *  @param  m           The source modulus
+ */
+void MODULUS_toOctets(octet *P, octet *Q, MODULUS_priv *m);
+
+/** \brief Clean memory associated to a modulus
+ *
+ *  @param  m           The modulus to clean
+ */
+void MODULUS_kill(MODULUS_priv *m);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/amcl/nm_commitment.h b/include/amcl/nm_commitment.h
new file mode 100644
index 0000000..f3ee0b1
--- /dev/null
+++ b/include/amcl/nm_commitment.h
@@ -0,0 +1,64 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file nm_commitment.h
+ * @brief Non Malleable Commitment scheme declarations
+ *
+ */
+
+#ifndef NM_COMMITMENT_H
+#define NM_COMMITMENT_H
+
+#include "amcl/amcl.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define NM_COMMITMENT_OK   0             /**< Success */
+#define NM_COMMITMENT_FAIL 81            /**< Invalid Commitment */
+#define NM_COMMITMENT_INVALID_FORMAT 83  /**< An octet value has an invalid format */
+
+/* NM Commitment Scheme API */
+
+/*! \brief Generate a commitment for the value X
+ *
+ * @param RNG   CSPRNG to use for commitment
+ * @param X     Value to commit to
+ * @param R     Decommitment value. If RNG is null then this value is read and must be 256 bit long
+ * @param C     Commitment value
+ */
+extern void NM_COMMITMENT_commit(csprng *RNG, const octet *X, octet *R, octet *C);
+
+/*! \brief Decommit the value X
+ *
+ * @param X     Committed value
+ * @param R     Decommitment value. Must be 256 bit long
+ * @param C     Commitment value
+ * @return      Returns 1 for a valid decommitment, 0 otherwise
+ */
+extern int NM_COMMITMENT_decommit(const octet* X, const octet* R, octet* C);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/python/amcl/bit_commitment.py b/python/amcl/bit_commitment.py
new file mode 100644
index 0000000..4ba2e93
--- /dev/null
+++ b/python/amcl/bit_commitment.py
@@ -0,0 +1,426 @@
+#!/usr/bin/env python3
+
+"""
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+"""
+
+"""
+
+This module use cffi to access the c functions in the amcl_mpc library.
+
+"""
+
+import platform
+from . import core_utils
+
+_ffi = core_utils._ffi
+_ffi.cdef("""
+#define HDLOG_n_iters 128
+
+typedef BIG_1024_58 HDLOG_iter_values[HDLOG_n_iters][FFLEN_2048];
+
+typedef struct
+{
+    MODULUS_priv mod;
+    BIG_1024_58 pq[FFLEN_2048];
+    BIG_1024_58 alpha[FFLEN_2048];
+    BIG_1024_58 ialpha[FFLEN_2048];
+    BIG_1024_58 b0[FFLEN_2048];
+    BIG_1024_58 b1[FFLEN_2048];
+} BIT_COMMITMENT_priv;
+
+typedef struct
+{
+    BIG_1024_58 N[FFLEN_2048];
+    BIG_1024_58 b0[FFLEN_2048];
+    BIG_1024_58 b1[FFLEN_2048];
+} BIT_COMMITMENT_pub;
+
+typedef struct
+{
+    HDLOG_iter_values rho;
+    HDLOG_iter_values irho;
+    HDLOG_iter_values t;
+    HDLOG_iter_values it;
+} BIT_COMMITMENT_setup_proof;
+
+extern void BIT_COMMITMENT_setup(csprng *RNG, BIT_COMMITMENT_priv *m, octet *P, octet *Q, octet *B0, octet *ALPHA);
+extern void BIT_COMMITMENT_priv_fromOctets(BIT_COMMITMENT_priv *m, octet *P, octet *Q, octet *B0, octet * ALPHA);
+extern void BIT_COMMITMENT_priv_toOctets(octet *P, octet *Q, octet *B0, octet * ALPHA, BIT_COMMITMENT_priv *m);
+extern void BIT_COMMITMENT_priv_kill(BIT_COMMITMENT_priv *m);
+extern void BIT_COMMITMENT_priv_to_pub(BIT_COMMITMENT_pub *pub, BIT_COMMITMENT_priv *priv);
+extern void BIT_COMMITMENT_pub_fromOctets(BIT_COMMITMENT_pub *m, octet *N, octet *B0, octet *B1);
+extern void BIT_COMMITMENT_pub_toOctets(octet *N, octet *B0, octet *B1, BIT_COMMITMENT_pub *m);
+extern void BIT_COMMITMENT_setup_prove(csprng *RNG, BIT_COMMITMENT_priv *m, BIT_COMMITMENT_setup_proof *p, octet *id, octet *ad);
+extern int BIT_COMMITMENT_setup_verify(BIT_COMMITMENT_pub *m, BIT_COMMITMENT_setup_proof *p, octet *id, octet *ad);
+extern int BIT_COMMITMENT_setup_proof_fromOctets(BIT_COMMITMENT_setup_proof *p, octet *RHO, octet *IRHO, octet *T, octet *IT);
+extern void BIT_COMMITMENT_setup_proof_toOctets(octet *RHO, octet *IRHO, octet *T, octet *IT, BIT_COMMITMENT_setup_proof *p);
+""")
+
+if (platform.system() == 'Windows'):
+    _libamcl_mpc = _ffi.dlopen("libamcl_mpc.dll")
+elif (platform.system() == 'Darwin'):
+    _libamcl_mpc = _ffi.dlopen("libamcl_mpc.dylib")
+else:
+    _libamcl_mpc = _ffi.dlopen("libamcl_mpc.so")
+
+# Constants
+FS_2048 = 256      # Size of an FF_2048 in bytes
+HFS_2048 = 128     # Half-size of an FF_2048 in bytes
+
+HDLOG_iv_size = 128 * FS_2048 # 128 iterations are necessary for the HDLOG
+
+OK             = 0
+FAIL           = 121
+INVALID_PROOF  = 122
+INVALID_FORMAT = 123
+
+
+def priv_from_octets(p, q, b0, alpha):
+    """Read a Bit Commitment Private Modulus from byte arrays
+
+    Args::
+
+        p:     First factor of the modulus
+        q:     Second factor of the modulus
+        b0:    Generator of the subgroup
+        alpha: Exponent for the second generator
+
+    Returns::
+
+        priv:  Private modulus for the Bit Commitment
+
+    Raises::
+    """
+    priv = _ffi.new('BIT_COMMITMENT_priv*')
+
+    p, p_val         = core_utils.make_octet(None, p)
+    q, q_val         = core_utils.make_octet(None, q)
+    b0, b0_val       = core_utils.make_octet(None, b0)
+    alpha, alpha_val = core_utils.make_octet(None, alpha)
+    _ = p_val, q_val, b0_val, alpha_val
+
+    _libamcl_mpc.BIT_COMMITMENT_priv_fromOctets(priv, p, q, b0, alpha)
+
+    # Clear memory
+    core_utils.clear_octet(p)
+    core_utils.clear_octet(q)
+    core_utils.clear_octet(alpha)
+
+    return priv
+
+
+def priv_to_octets(priv):
+    """Write a Bit Commitment Private Modulus into byte arrays
+
+    Args::
+
+        priv:  Private modulus for the Bit Commitment
+
+    Returns::
+
+        p:     First factor of the modulus
+        q:     Second factor of the modulus
+        b0:    Generator of the subgroup
+        alpha: Exponent for the second generator
+
+    Raises::
+    """
+    p, p_val         = core_utils.make_octet(HFS_2048)
+    q, q_val         = core_utils.make_octet(HFS_2048)
+    b0, b0_val       = core_utils.make_octet(FS_2048)
+    alpha, alpha_val = core_utils.make_octet(FS_2048)
+    _ = p_val, q_val, b0_val, alpha_val
+
+    _libamcl_mpc.BIT_COMMITMENT_priv_toOctets(p, q, b0, alpha, priv)
+
+    p_bytes     = core_utils.to_str(p)
+    q_bytes     = core_utils.to_str(q)
+    b0_bytes    = core_utils.to_str(b0)
+    alpha_bytes = core_utils.to_str(alpha)
+
+    # Clear memory
+    core_utils.clear_octet(p)
+    core_utils.clear_octet(q)
+    core_utils.clear_octet(alpha)
+
+    return p_bytes, q_bytes, b0_bytes, alpha_bytes
+
+
+def priv_to_pub(priv):
+    """Exports the public portion of a Bit Commitment Private Modulus
+
+    Args::
+
+        priv:  Private modulus for the Bit Commitment
+
+    Returns::
+
+        pub:   Public modulus for the Bit Commitment
+
+    Raises::
+    """
+    pub = _ffi.new('BIT_COMMITMENT_pub*')
+
+    _libamcl_mpc.BIT_COMMITMENT_priv_to_pub(pub, priv)
+
+    return pub
+
+
+def pub_from_octets(n, b0, b1):
+    """Read a Bit Commitment Public Modulus from byte arrays
+
+    Args::
+
+        n:     Public Modulus
+        b0:    First generator of the subgroup
+        b1:    Second generator of the subgroup
+
+    Returns::
+
+        pub:  Public modulus for the Bit Commitment
+
+    Raises::
+    """
+    pub = _ffi.new('BIT_COMMITMENT_pub*')
+
+    n, n_val   = core_utils.make_octet(None, n)
+    b0, b0_val = core_utils.make_octet(None, b0)
+    b1, b1_val = core_utils.make_octet(None, b1)
+    _ = n_val, b0_val, b1_val
+
+    _libamcl_mpc.BIT_COMMITMENT_pub_fromOctets(pub, n, b0, b1)
+
+    return pub
+
+
+def pub_to_octets(pub):
+    """Write a Bit Commitment Public Modulus into byte arrays
+
+    Args::
+
+        pub:  Public modulus for the Bit Commitment
+
+    Returns::
+
+        n:     Public Modulus
+        b0:    First generator of the subgroup
+        b1:    Second generator of the subgroup
+
+    Raises::
+    """
+
+    n, n_val   = core_utils.make_octet(FS_2048)
+    b0, b0_val = core_utils.make_octet(FS_2048)
+    b1, b1_val = core_utils.make_octet(FS_2048)
+    _ = n_val, b0_val, b1_val
+
+    _libamcl_mpc.BIT_COMMITMENT_pub_toOctets(n, b0, b1, pub)
+
+    n_bytes  = core_utils.to_str(n)
+    b0_bytes = core_utils.to_str(b0)
+    b1_bytes = core_utils.to_str(b1)
+
+    return n_bytes, b0_bytes, b1_bytes
+
+
+def setup_proof_from_octets(rho, irho, t, it):
+    """Read a ZKP of well formedness of a BC Setup from byte arrays
+
+    Args::
+
+        rho:   Commitment for the first generator ZKP
+        irho:  Commitment for the second generator ZKP
+        t:     Proof for the first generator ZKP
+        it:    Proof for the second generator ZKP
+
+    Returns::
+
+        proof: Imported proof system
+        rc:    OK or an error code
+
+    Raises::
+    """
+    rho, rho_val   = core_utils.make_octet(None, rho)
+    irho, irho_val = core_utils.make_octet(None, irho)
+    t, t_val       = core_utils.make_octet(None, t)
+    it, it_val     = core_utils.make_octet(None, it)
+    _ = rho_val, irho_val, t_val, it_val
+
+    proof = _ffi.new('BIT_COMMITMENT_setup_proof*')
+
+    rc = _libamcl_mpc.BIT_COMMITMENT_setup_proof_fromOctets(proof, rho, irho, t, it)
+    if rc != OK:
+        return _ffi.NULL, INVALID_FORMAT
+
+    return proof, OK
+
+
+def setup_proof_to_octets(proof):
+    """Write a Bit Commitment Public Modulus into byte arrays
+
+    Args::
+
+        proof: Proof system to export
+
+    Returns::
+
+        rho:   Commitment for the first generator ZKP
+        irho:  Commitment for the second generator ZKP
+        t:     Proof for the first generator ZKP
+        it:    Proof for the second generator ZKP
+
+    Raises::
+
+    """
+    rho, rho_val   = core_utils.make_octet(HDLOG_iv_size)
+    irho, irho_val = core_utils.make_octet(HDLOG_iv_size)
+    t, t_val       = core_utils.make_octet(HDLOG_iv_size)
+    it, it_val     = core_utils.make_octet(HDLOG_iv_size)
+    _ = rho_val, irho_val, t_val, it_val
+
+
+    _libamcl_mpc.BIT_COMMITMENT_setup_proof_toOctets(rho, irho, t, it, proof)
+
+    rho_bytes  = core_utils.to_str(rho)
+    irho_bytes = core_utils.to_str(irho)
+    t_bytes    = core_utils.to_str(t)
+    it_bytes   = core_utils.to_str(it)
+
+    return rho_bytes, irho_bytes, t_bytes, it_bytes
+
+
+def setup(rng, p=None, q=None, b0=None, alpha=None):
+    """Generate a Setup for the Bit Commitment
+
+    Args::
+
+        rng :  Pointer to cryptographically secure pseudo-random generator instance
+        p:     First factor of the modulus
+        q:     Second factor of the modulus
+        b0:    Generator of the subgroup
+        alpha: DLOG exponent for the second generator - Optional
+
+    Returns::
+
+        priv:  Private modulus for the Bit Commitment Setup
+
+    Raises::
+    """
+    priv = _ffi.new('BIT_COMMITMENT_priv*')
+
+    if p is None:
+        p = _ffi.NULL
+    else:
+        p, p_val = core_utils.make_octet(None, p)
+        _ = p_val
+
+    if q is None:
+        q = _ffi.NULL
+    else:
+        q, q_val = core_utils.make_octet(None, q)
+        _ = q_val
+
+    if b0 is None:
+        b0 = _ffi.NULL
+    else:
+        b0, b0_val = core_utils.make_octet(None, b0)
+        _ = b0_val
+
+    if alpha is None:
+        alpha = _ffi.NULL
+    else:
+        alpha, alpha_val = core_utils.make_octet(None, alpha)
+        _ = alpha_val
+
+    _libamcl_mpc.BIT_COMMITMENT_setup(rng, priv, p, q, b0, alpha)
+
+    # Clear memory
+    if p != _ffi.NULL:
+        core_utils.clear_octet(p)
+
+    if q != _ffi.NULL:
+        core_utils.clear_octet(q)
+
+    if alpha != _ffi.NULL:
+        core_utils.clear_octet(alpha)
+
+    return priv
+
+
+def setup_prove(rng, priv, id, ad=None):
+    """Generate a proof of well formedness of the Private Modulus priv
+
+    Args::
+
+        rng:  Pointer to cryptographically secure pseudo-random generator instance
+        priv: Private Bit Commitment Setup modulus
+        id:   Unique identifier of the prover
+        ad:   Additional data to bind in the proof
+
+    Returns::
+
+        proof: Proof of well formedness of priv
+
+    Raises::
+    """
+    proof = _ffi.new('BIT_COMMITMENT_setup_proof*')
+
+    if ad is None:
+        ad = _ffi.NULL
+    else:
+        ad, ad_val = core_utils.make_octet(None, ad)
+        _ = ad_val # Suppress warning
+
+    id, id_val = core_utils.make_octet(None, id)
+    _ = id_val
+
+    _libamcl_mpc.BIT_COMMITMENT_setup_prove(rng, priv, proof, id, ad)
+
+    return proof
+
+
+def setup_verify(pub, proof, id, ad=None):
+    """Generate a proof of well formedness of the Private Modulus priv
+
+    Args::
+
+        pub:   Private Bit Commitment Setup modulus
+        proof: Proof of well formedness of pub
+        id:    Unique identifier of the prover
+        ad:    Additional data to bind in the proof
+
+    Returns::
+
+        rc:    OK or an error code
+
+    Raises::
+    """
+    if ad is None:
+        ad = _ffi.NULL
+    else:
+        ad, ad_val = core_utils.make_octet(None, ad)
+        _ = ad_val # Suppress warning
+
+    id, id_val = core_utils.make_octet(None, id)
+    _ = id_val
+
+    rc = _libamcl_mpc.BIT_COMMITMENT_setup_verify(pub, proof, id, ad)
+
+    return rc
+
diff --git a/python/amcl/commitments.py b/python/amcl/nm_commitment.py
similarity index 85%
rename from python/amcl/commitments.py
rename to python/amcl/nm_commitment.py
index 4cf82f4..d3b515f 100644
--- a/python/amcl/commitments.py
+++ b/python/amcl/nm_commitment.py
@@ -30,8 +30,8 @@ from . import core_utils
 
 _ffi = core_utils._ffi
 _ffi.cdef("""
-extern void COMMITMENTS_NM_commit(csprng *RNG, const octet *X, octet *R, octet *C);
-extern int COMMITMENTS_NM_decommit(const octet* X, const octet* R, octet* C);
+extern void NM_COMMITMENT_commit(csprng *RNG, const octet *X, octet *R, octet *C);
+extern int NM_COMMITMENT_decommit(const octet* X, const octet* R, octet* C);
 """)
 
 if (platform.system() == 'Windows'):
@@ -44,10 +44,13 @@ else:
 # Constants
 SHA256 = 32
 
-OK   = 0
-FAIL = 81
+OK             = 0
+FAIL           = 81
+INVALID_PROOF  = 82
+INVALID_FORMAT = 83
 
-def nm_commit(rng, x, r=None):
+
+def commit(rng, x, r=None):
     """ Commit to the value x
 
     Generate a commitment c to the value x, using the value r.
@@ -63,7 +66,6 @@ def nm_commit(rng, x, r=None):
     Returns::
 
     Raises::
-
     """
 
     if r is None:
@@ -78,7 +80,7 @@ def nm_commit(rng, x, r=None):
     c_oct, c_val = core_utils.make_octet(SHA256)
     _ = x_val, c_val # Suppress warning
 
-    _libamcl_mpc.COMMITMENTS_NM_commit(rng, x_oct, r_oct, c_oct)
+    _libamcl_mpc.NM_COMMITMENT_commit(rng, x_oct, r_oct, c_oct)
 
     r = core_utils.to_str(r_oct)
 
@@ -88,7 +90,8 @@ def nm_commit(rng, x, r=None):
 
     return r, core_utils.to_str(c_oct)
 
-def nm_decommit(x, r, c):
+
+def decommit(x, r, c):
     """ Decommit commitment c
 
     Decommit a commitment c to the value x, using the value r.
@@ -101,8 +104,9 @@ def nm_decommit(x, r, c):
 
     Returns::
 
-    Raises::
+        ec: OK or an error code
 
+    Raises::
     """
 
     x_oct, x_val = core_utils.make_octet(None, x)
@@ -110,6 +114,6 @@ def nm_decommit(x, r, c):
     c_oct, c_val = core_utils.make_octet(None, c)
     _ = x_val, r_val, c_val # Suppress warning
 
-    ec = _libamcl_mpc.COMMITMENTS_NM_decommit(x_oct, r_oct, c_oct)
+    ec = _libamcl_mpc.NM_COMMITMENT_decommit(x_oct, r_oct, c_oct)
 
     return ec
diff --git a/python/benchmark/bench_nm_commit.py b/python/benchmark/bench_nm_commit.py
index a10012e..3a38c2f 100755
--- a/python/benchmark/bench_nm_commit.py
+++ b/python/benchmark/bench_nm_commit.py
@@ -25,7 +25,7 @@ from bench import time_func
 
 sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
 
-from amcl import commitments
+from amcl import nm_commitment as nm
 
 x_hex = "40576370e36018f6bfaffc4c66780303a361f0c5f4a18a86a74fb179ca0fcf22"
 r_hex = "296f910bde4530efe3533ed3b74475d6022364db2e57773207734b6daf547ac8"
@@ -35,13 +35,13 @@ if __name__ == "__main__":
     r = bytes.fromhex(r_hex)
 
     # Generate quantities for benchmark
-    r, c = commitments.nm_commit(None, x, r)
+    r, c = nm.commit(None, x, r)
 
-    assert commitments.nm_decommit(x, r, c) == commitments.OK
+    assert nm.decommit(x, r, c) == nm.OK
 
     # Run benchmark
-    fncall = lambda: commitments.nm_commit(None, x, r)
+    fncall = lambda: nm.commit(None, x, r)
     time_func("nm_commit  ", fncall, unit="us")
 
-    fncall = lambda: commitments.nm_decommit(x, r, c)
+    fncall = lambda: nm.decommit(x, r, c)
     time_func("nm_decommit", fncall, unit="us")
diff --git a/python/examples/example_bc_setup.py b/python/examples/example_bc_setup.py
new file mode 100755
index 0000000..bdada25
--- /dev/null
+++ b/python/examples/example_bc_setup.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+
+"""
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+"""
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from amcl import core_utils
+from amcl import bit_commitment as bc
+
+seed_hex = "78d0fb6705ce77dee47d03eb5b9c4d30"
+
+if __name__ == "__main__":
+    seed = bytes.fromhex(seed_hex)
+    rng = core_utils.create_csprng(seed)
+
+    id = b'unique_identifier'
+    ad = b'additional_data'
+
+    print("Example Bit Commitment Setup and ZKP")
+    print("\tID = {}".format(id))
+    print("\tAD = {}".format(ad))
+
+    print("\nSetup Bit Commitment Parameters (this might take a while)")
+    priv = bc.setup(rng)
+
+    p, q, b0, alpha = bc.priv_to_octets(priv)
+    print("\tp     = {}".format(p.hex()))
+    print("\tq     = {}".format(q.hex()))
+    print("\tb0    = {}".format(b0.hex()))
+    print("\talpha = {}".format(alpha.hex()))
+
+    print("\nExport Public Portion of Parameters")
+    pub = bc.priv_to_pub(priv)
+
+    n, b0, b1 = bc.pub_to_octets(pub)
+    print("\tn  = {}".format(n.hex()))
+    print("\tb0 = {}".format(b0.hex()))
+    print("\tb1 = {}".format(b1.hex()))
+
+    print("\nProve well formedness of Parameters")
+    proof = bc.setup_prove(rng, priv, id, ad=ad)
+
+    print("\tProof omitted for briefness. See test vectors for an example")
+
+    print("\nVerify proof")
+    rc = bc.setup_verify(pub, proof, id, ad=ad)
+
+    if rc == bc.OK:
+        print("\tSuccess!")
+    else:
+        print("\tFailure!")
diff --git a/python/examples/example_nm_commit.py b/python/examples/example_nm_commit.py
index 024e60c..011e218 100755
--- a/python/examples/example_nm_commit.py
+++ b/python/examples/example_nm_commit.py
@@ -24,7 +24,8 @@ import sys
 
 sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
 
-from amcl import core_utils, commitments
+from amcl import core_utils
+from amcl import nm_commitment as nm
 
 seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
 
@@ -38,17 +39,17 @@ if __name__ == "__main__":
     x = b'BANANA'
 
     # Commitment Phase
-    r, c = commitments.nm_commit(rng, x)
+    r, c = nm.commit(rng, x)
 
     print("\nCommitment")
     print(f"\tr = {r.hex()}")
     print(f"\tc = {c.hex()}")
 
     # Decommitment Phase. After both c, r and x have been revealed
-    rc = commitments.nm_decommit(x, r, c)
+    rc = nm.decommit(x, r, c)
 
     print("\nDecommitment")
-    if rc == commitments.OK:
+    if rc == nm.OK:
         print("\tSuccess")
     else:
         print("\tFailure")
diff --git a/python/test/CMakeLists.txt b/python/test/CMakeLists.txt
index 77def9b..8f20929 100644
--- a/python/test/CMakeLists.txt
+++ b/python/test/CMakeLists.txt
@@ -46,8 +46,13 @@ file(COPY ${SCHNORR_TV} DESTINATION "${PROJECT_BINARY_DIR}/python/test/schnorr/"
 
 # NM Commitment test vector
 file(
-  COPY ${PROJECT_SOURCE_DIR}/testVectors/commitments/nm_commit.json
-  DESTINATION "${PROJECT_BINARY_DIR}/python/test/commitments/")
+  COPY ${PROJECT_SOURCE_DIR}/testVectors/nm_commitment/commit.json
+  DESTINATION "${PROJECT_BINARY_DIR}/python/test/nm_commitment/")
+
+# BC Commitment test vector
+file(
+  COPY ${PROJECT_SOURCE_DIR}/testVectors/bit_commitment/setup.json
+  DESTINATION "${PROJECT_BINARY_DIR}/python/test/bit_commitment/")
 
 # ZK Factoring test vectors
 file(GLOB SCHNORR_TV "${PROJECT_SOURCE_DIR}/testVectors/factoring_zk/*.json")
@@ -65,6 +70,7 @@ if(NOT CMAKE_BUILD_TYPE STREQUAL "ASan")
   add_python_test(test_python_mpc_s            test_s.py)
   add_python_test(test_python_mpc_schnorr      test_schnorr.py)
   add_python_test(test_python_mpc_nm_commit    test_nm_commit.py)
+  add_python_test(test_python_mpc_bc_setup     test_bc_setup.py)
   add_python_test(test_python_mpc_zk_factoring test_zk_factoring.py)
 endif(NOT CMAKE_BUILD_TYPE STREQUAL "ASan")
 
diff --git a/python/test/test_bc_setup.py b/python/test/test_bc_setup.py
new file mode 100755
index 0000000..e6cbf1f
--- /dev/null
+++ b/python/test/test_bc_setup.py
@@ -0,0 +1,188 @@
+#!/usr/bin/env python3
+
+"""
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+"""
+
+import os
+import sys
+import json
+import unittest
+
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from amcl import core_utils
+from amcl import bit_commitment as bc
+
+# Load and preprocess test vectors
+with open("bit_commitment/setup.json", "r") as f:
+    vectors = json.load(f)
+
+for vector in vectors:
+    for key, val in vector.items():
+        if key != "TEST":
+            vector[key] = bytes.fromhex(val)
+
+class TestBCSetup(unittest.TestCase):
+    """ Test BC Setup """
+
+    def setUp(self):
+        # Deterministic PRNG for testing purposes
+        seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
+        seed = bytes.fromhex(seed_hex)
+        self.rng = core_utils.create_csprng(seed)
+
+    def test_tv(self):
+        """ Test using test vector """
+
+        for vector in vectors:
+            priv = bc.setup(self.rng, vector['P'], vector['Q'], vector['B0'], vector['ALPHA'])
+
+            pub = bc.priv_to_pub(priv)
+
+            n, b0, b1 = bc.pub_to_octets(pub)
+
+            self.assertEqual(vector['N'],  n)
+            self.assertEqual(vector['B0'], b0)
+            self.assertEqual(vector['B1'], b1)
+
+
+class TestBCPubOctetFuncs(unittest.TestCase):
+    """ Test BC_pub Octet Functions """
+
+    def test_tv(self):
+        """ Test using test vector """
+
+        for vector in vectors:
+            pub = bc.pub_from_octets(vector['N'], vector['B0'], vector['B1'])
+
+            n, b0, b1 = bc.pub_to_octets(pub)
+
+            self.assertEqual(vector['N'],  n)
+            self.assertEqual(vector['B0'], b0)
+            self.assertEqual(vector['B1'], b1)
+
+
+class TestBCPrivOctetFuncs(unittest.TestCase):
+    """ Test BC_priv Octet Functions """
+
+    def test_tv(self):
+        """ Test using test vector """
+
+        for vector in vectors:
+            priv = bc.priv_from_octets(vector['P'], vector['Q'], vector['B0'], vector['ALPHA'])
+            p, q, b0, alpha = bc.priv_to_octets(priv)
+
+            self.assertEqual(vector['P'],  p)
+            self.assertEqual(vector['Q'],  q)
+            self.assertEqual(vector['B0'], b0)
+            self.assertEqual(vector['ALPHA'], alpha)
+
+
+class TestBCZKP(unittest.TestCase):
+    """ Test BC well formedness ZKP """
+
+    def setUp(self):
+        # Deterministic PRNG for testing purposes
+        seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
+        seed = bytes.fromhex(seed_hex)
+        self.rng = core_utils.create_csprng(seed)
+        self.id = b'unique_identifier'
+        self.ad = b'additional_data'
+
+    def test_tv_happy_path(self):
+        """ Test happy path """
+        vector = vectors[0]
+
+        priv = bc.priv_from_octets(vector['P'], vector['Q'], vector['B0'], vector['ALPHA'])
+        pub = bc.priv_to_pub(priv)
+
+        proof = bc.setup_prove(self.rng, priv, self.id, self.ad)
+        rc = bc.setup_verify(pub, proof, self.id, self.ad)
+
+        self.assertEqual(rc, bc.OK)
+
+    def test_invalid_proof(self):
+        """ Invalid b0 ZKP """
+        vector = vectors[0]
+        priv = bc.priv_from_octets(vector['P'], vector['Q'], vector['B0'], vector['ALPHA'])
+        pub = bc.priv_to_pub(priv)
+        proof = bc.setup_prove(self.rng, priv, self.id, self.ad)
+
+        rho, irho, t, it = bc.setup_proof_to_octets(proof)
+        invalid_b0_proof, _ = bc.setup_proof_from_octets(t, irho, rho, it)
+        invalid_b1_proof, _ = bc.setup_proof_from_octets(rho, it, t, irho)
+
+        rc = bc.setup_verify(pub, invalid_b0_proof, self.id, self.ad)
+        self.assertEqual(rc, bc.INVALID_PROOF)
+
+        rc = bc.setup_verify(pub, invalid_b1_proof, self.id, self.ad)
+        self.assertEqual(rc, bc.INVALID_PROOF)
+
+
+class TestBCZKPOctetFunc(unittest.TestCase):
+    """ Test BC well formedness ZKP octet functions """
+
+    def setUp(self):
+        # Deterministic PRNG for testing purposes
+        seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
+        seed = bytes.fromhex(seed_hex)
+        rng = core_utils.create_csprng(seed)
+
+        vector = vectors[0]
+        priv = bc.priv_from_octets(vector['P'], vector['Q'], vector['B0'], vector['ALPHA'])
+
+        proof = bc.setup_prove(rng, priv, b'id')
+
+        self.proof = proof
+        self.pub   = bc.priv_to_pub(priv)
+
+
+    def test_ok(self):
+        """ Test export/import is still valid """
+        rho, irho, t, it = bc.setup_proof_to_octets(self.proof)
+        proof, rc = bc.setup_proof_from_octets(rho, irho, t, it)
+        self.assertEqual(rc, bc.OK)
+
+        rc = bc.setup_verify(self.pub, proof, b'id')
+        self.assertEqual(rc, bc.OK)
+
+    def test_invalid(self):
+        """ Test importing invalid HDLOG values """
+        rho, irho, t, it = bc.setup_proof_to_octets(self.proof)
+
+        invalid = b'BANANA'
+
+        _, rc = bc.setup_proof_from_octets(invalid, irho, t, it)
+        self.assertEqual(rc, bc.INVALID_FORMAT)
+
+        _, rc = bc.setup_proof_from_octets(rho, invalid, t, it)
+        self.assertEqual(rc, bc.INVALID_FORMAT)
+
+        _, rc = bc.setup_proof_from_octets(rho, irho, invalid, it)
+
+
+        self.assertEqual(rc, bc.INVALID_FORMAT)
+
+        _, rc = bc.setup_proof_from_octets(rho, irho, t, invalid)
+        self.assertEqual(rc, bc.INVALID_FORMAT)
+
+
+if __name__ == '__main__':
+    # Run tests
+    unittest.main()
diff --git a/python/test/test_nm_commit.py b/python/test/test_nm_commit.py
index e7dfb7a..1431a3c 100755
--- a/python/test/test_nm_commit.py
+++ b/python/test/test_nm_commit.py
@@ -26,10 +26,11 @@ import unittest
 
 sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
 
-from amcl import commitments, core_utils
+from amcl import core_utils
+from amcl import nm_commitment as nm
 
 # Load and preprocess test vectors
-with open("commitments/nm_commit.json", "r") as f:
+with open("nm_commitment/commit.json", "r") as f:
     vectors = json.load(f)
 
 for vector in vectors:
@@ -58,14 +59,14 @@ class TestNMCommit(unittest.TestCase):
         """ Test using test vectors """
 
         for vector in vectors:
-            r, c = commitments.nm_commit(None, vector['X'], vector['R'])
+            r, c = nm.commit(None, vector['X'], vector['R'])
 
             self.assertEqual(vector['R'], r)
             self.assertEqual(vector['C'], c)
 
     def test_random(self):
         """ Test using rng """
-        r, c = commitments.nm_commit(self.rng, self.msg)
+        r, c = nm.commit(self.rng, self.msg)
 
         self.assertEqual(r, self.r_golden)
         self.assertEqual(c, self.c_golden)
@@ -78,16 +79,16 @@ class TestNMDecommit(unittest.TestCase):
         """ Test using test vectors """
 
         for vector in vectors:
-            rc = commitments.nm_decommit(vector['X'], vector['R'], vector['C'])
+            rc = nm.decommit(vector['X'], vector['R'], vector['C'])
 
-            self.assertEqual(rc, commitments.OK)
+            self.assertEqual(rc, nm.OK)
 
     def test_failure(self):
         """ Test error codes are propagated correctly """
 
-        rc = commitments.nm_decommit(vector['X'], vector['X'], vector['C'])
+        rc = nm.decommit(vector['X'], vector['X'], vector['C'])
 
-        self.assertEqual(rc, commitments.FAIL)
+        self.assertEqual(rc, nm.FAIL)
 
 if __name__ == '__main__':
     # Run tests
diff --git a/src/bit_commitment.c b/src/bit_commitment.c
new file mode 100644
index 0000000..20c26de
--- /dev/null
+++ b/src/bit_commitment.c
@@ -0,0 +1,972 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file bit_commitment.c
+ * @brief ZKP for Polynomial Relations based on the Bit Commitment
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "amcl/bit_commitment.h"
+#include "amcl/hash_utils.h"
+
+static char* curve_order_hex = "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141";
+
+/* Remark 1
+ *
+ * The generation of some random blinding values in this file uses
+ * a modular reduction, producing a slightly biased distribution.
+ * However, the random numbers reduced have significatively more
+ * bits of entropy than the modulus, making this bias negligible.
+ *
+ * In particular we have moduli
+ * |q^3|    ~ 768
+ * |Nt*q|   ~ 2048 + 256
+ * |Nt*q^3| ~ 2048 + 768
+ *
+ * used (respectively) to reduce random numbers of size 1024, 3096
+ * and 3096. Each of these random numbers has at least 256 bits of
+ * extra entropy, making the exploitation of this bias not viable.
+ */
+
+/* FF manipulation utilities
+ *
+ * These might be nice additions to milagro-crypto-c ff API
+ *
+ * TODO in milagro-crypto-c
+ *  - Add asymmetric mul/mod using the internal ff api
+ */
+
+// Asymmetric mul. Assuming xlen * k = ylen for some integer k
+//
+// Efficiently compute product by breaking up y in k chunks of length xlen
+// and computing the product separately. r must be different from x and y and
+// it must have length at least rlen = xlen + ylen
+void FF_2048_amul(BIG_1024_58 *r, BIG_1024_58 *x, int xlen, BIG_1024_58 *y, int ylen)
+{
+    int i;
+    int rlen = xlen+ylen;
+
+#ifndef C99
+    BIG_1024_58 t[2*FFLEN_2048];
+#else
+    BIG_1024_58 t[rlen];
+#endif
+
+    FF_2048_zero(r, rlen);
+
+    for (i = 0; i < ylen; i+=xlen)
+    {
+        FF_2048_zero(t, rlen);
+        FF_2048_mul(t+i, x, y+i, xlen);
+        FF_2048_add(r, r, t, rlen);
+    }
+}
+
+// Asymmetric mod. Assuming plen * k = xlen for some integer k
+//
+// Starting from the top of x, select the top 2 * plen BIGs and reduce
+// them mod p, reducing the length of x by a plen until x is completely reduced.
+void FF_2048_amod(BIG_1024_58 *r, BIG_1024_58 *x, int xlen, BIG_1024_58 *p, int plen)
+{
+    int i;
+
+#ifndef C99
+    BIG_1024_58 t[2*FFLEN_2048];
+#else
+    BIG_1024_58 t[xlen];
+#endif
+
+    FF_2048_copy(t, x, xlen);
+
+    for (i = xlen - 2*plen; i >= 0; i--)
+    {
+        FF_2048_dmod(t+i, t+i, p, plen);
+    }
+
+    FF_2048_copy(r, t, plen);
+}
+
+// Utility function to compute the triple power for verification purposes.
+// h1^s1 * h2^s2 * z^(-e) mod P
+//
+// h1, h2 are reduced modulo P
+// s1 is reduced modulo P-1 if indicated
+// s2 is reduced modulo P-1
+// z is reduced and inverted modulo P
+// e is left as is
+void BIT_COMMITMENT_triple_power(BIG_1024_58 *proof, BIG_1024_58 *h1, BIG_1024_58 *h2, BIG_1024_58 *s1, BIG_1024_58 *s2, BIG_1024_58 *z, BIG_1024_58 *e, BIG_1024_58 *p, int reduce_s1)
+{
+    BIG_1024_58 hws1[HFLEN_2048];
+    BIG_1024_58 hws2[HFLEN_2048];
+    BIG_1024_58 hws3[HFLEN_2048];
+    BIG_1024_58 hws4[HFLEN_2048];
+    BIG_1024_58 eneg[HFLEN_2048];
+
+    FF_2048_copy(hws1, p, HFLEN_2048);
+    FF_2048_dec(hws1, 1, HFLEN_2048);
+    FF_2048_amod(hws4, s2, FFLEN_2048 + HFLEN_2048, hws1, HFLEN_2048);
+    FF_2048_sub(eneg, hws1, e, HFLEN_2048);
+    FF_2048_norm(eneg, HFLEN_2048);
+
+    if (reduce_s1)
+    {
+        FF_2048_dmod(hws3, s1, hws1, HFLEN_2048);
+    }
+    else
+    {
+        FF_2048_copy(hws3, s1, HFLEN_2048);
+    }
+
+    FF_2048_dmod(hws1, h1, p, HFLEN_2048);
+    FF_2048_dmod(hws2, h2, p, HFLEN_2048);
+
+    FF_2048_dmod(proof, z, p, HFLEN_2048);
+    FF_2048_ct_pow_3(proof, hws1, hws3, hws2, hws4, proof, eneg, p, HFLEN_2048, HFLEN_2048);
+
+    // Clean memory
+    FF_2048_zero(hws1, HFLEN_2048);
+    FF_2048_zero(hws2, HFLEN_2048);
+    FF_2048_zero(hws3, HFLEN_2048);
+    FF_2048_zero(hws4, HFLEN_2048);
+}
+
+
+/* Hash helpers for challenge functions */
+
+void BIT_COMMITMENT_hash_params(hash256 *sha, PAILLIER_public_key *key, BIT_COMMITMENT_pub *m)
+{
+    char oct[FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Process Paillier Public key
+    FF_4096_toOctet(&OCT, key->n, HFLEN_4096);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    // Process Bit Commitment modulus
+    FF_2048_toOctet(&OCT, m->N, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, m->b0, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, m->b1, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+}
+
+void BIT_COMMITMENT_hash_commitment(hash256 *sha, BIT_COMMITMENT_commitment *c)
+{
+    char oct[2 * FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    FF_2048_toOctet(&OCT, c->z, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_4096_toOctet(&OCT, c->u, FFLEN_4096);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, c->w, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+}
+
+void BIT_COMMITMENT_hash_muladd_commitment(hash256 *sha, BIT_COMMITMENT_muladd_commitment *c)
+{
+    char oct[2 * FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    FF_2048_toOctet(&OCT, c->z, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, c->z1, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, c->t, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, c->v, 2 * FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+
+    FF_2048_toOctet(&OCT, c->w, FFLEN_2048);
+    HASH_UTILS_hash_oct(sha, &OCT);
+}
+
+/* ZKP of knowledge and range of Paillier Ciphertext */
+
+void BIT_COMMITMENT_commit(csprng *RNG, PAILLIER_private_key *key, BIT_COMMITMENT_pub *m, octet *X, BIT_COMMITMENT_rv *rv, BIT_COMMITMENT_commitment *c)
+{
+    BIG_1024_58 n[FFLEN_2048];
+    BIG_1024_58 q[HFLEN_2048];
+    BIG_1024_58 invp2q2[FFLEN_2048];
+    BIG_1024_58 n2[2 * FFLEN_2048];
+
+    BIG_1024_58 ws1[FFLEN_2048];
+    BIG_1024_58 ws2[FFLEN_2048];
+    BIG_1024_58 ws3[FFLEN_2048];
+    BIG_1024_58 dws1[2 * FFLEN_2048];
+    BIG_1024_58 dws2[2 * FFLEN_2048];
+
+    char oct[2 * FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Curve order
+    OCT_fromHex(&OCT, curve_order_hex);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(q, &OCT, HFLEN_2048);
+
+    FF_2048_mul(n, key->p, key->q, HFLEN_2048);
+    FF_2048_sqr(n2, n, FFLEN_2048);
+    FF_2048_norm(n2, 2 * FFLEN_2048);
+    FF_2048_invmodp(invp2q2, key->p2, key->q2, FFLEN_2048);
+
+    if (RNG != NULL)
+    {
+        FF_2048_sqr(ws1, q, HFLEN_2048);
+        FF_2048_mul(ws2, q, ws1, HFLEN_2048);
+
+        // Generate alpha in [0, .., q^3]
+        // See Remark 1 at the top for more information
+        FF_2048_zero(rv->alpha, FFLEN_2048);
+        FF_2048_random(rv->alpha, RNG, HFLEN_2048);
+        FF_2048_mod(rv->alpha, ws2, HFLEN_2048);
+
+        // Generate beta in [0, .., N]
+        FF_2048_randomnum(rv->beta, n, RNG, FFLEN_2048);
+
+        // Generate gamma in [0, .., Nt * q^3]
+        // See Remark 1 at the top for more information
+        FF_2048_amul(dws1, ws2, HFLEN_2048, m->N, FFLEN_2048);
+        FF_2048_random(rv->gamma, RNG, FFLEN_2048 + HFLEN_2048);
+        FF_2048_mod(rv->gamma, dws1, FFLEN_2048 + HFLEN_2048);
+
+        // Generate rho in [0, .., Nt * q]
+        // See Remark 1 at the top for more information
+        FF_2048_amul(dws1, q, HFLEN_2048, m->N, FFLEN_2048);
+        FF_2048_random(rv->rho, RNG, FFLEN_2048 + HFLEN_2048);
+        FF_2048_mod(rv->rho, dws1, FFLEN_2048 + HFLEN_2048);
+    }
+
+    // Read input
+    OCT_copy(&OCT, X);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_zero(dws1, FFLEN_2048 + HFLEN_2048);
+    FF_2048_fromOctet(dws1, &OCT, HFLEN_2048);
+
+    // Compute z and w
+    FF_2048_ct_pow_2(c->z, m->b0, dws1, m->b1, rv->rho, m->N, FFLEN_2048, FFLEN_2048 + HFLEN_2048);
+
+    FF_2048_copy(dws1, rv->alpha, HFLEN_2048);
+    FF_2048_ct_pow_2(c->w, m->b0, dws1, m->b1, rv->gamma, m->N, FFLEN_2048, FFLEN_2048 + HFLEN_2048);
+
+    // Compute u using CRT and Paillier PK trick
+
+    // Compute 1 + n * alpha
+    // Defer the increment after the modular reduction so it can
+    // be performed without conversion to FF_4096
+    FF_2048_zero(dws2, 2 * FFLEN_2048);
+    FF_2048_amul(dws2, rv->alpha, HFLEN_2048, n, FFLEN_2048);
+
+    // Compute mod P^2
+    FF_2048_dmod(ws3, dws2, key->p2, FFLEN_2048);
+    FF_2048_inc(ws3, 1, FFLEN_2048);
+    FF_2048_norm(ws3, FFLEN_2048);
+
+    FF_2048_ct_pow(ws1, rv->beta, n, key->p2, FFLEN_2048, FFLEN_2048);
+
+    FF_2048_mul(dws1, ws1, ws3, FFLEN_2048);
+    FF_2048_dmod(ws1, dws1, key->p2, FFLEN_2048);
+
+    // Compute mod Q^2
+    FF_2048_dmod(ws3, dws2, key->q2, FFLEN_2048);
+    FF_2048_inc(ws3, 1, FFLEN_2048);
+    FF_2048_norm(ws3, FFLEN_2048);
+
+    FF_2048_ct_pow(ws2, rv->beta, n, key->q2, FFLEN_2048, FFLEN_2048);
+
+    FF_2048_mul(dws1, ws2, ws3, FFLEN_2048);
+    FF_2048_dmod(ws2, dws1, key->q2, FFLEN_2048);
+
+    // Combine results
+    FF_2048_crt(dws1, ws1, ws2, key->p2, invp2q2, n2, FFLEN_2048);
+
+    // Convert u as FF_4096 since it is only used as such
+    FF_2048_toOctet(&OCT, dws1, 2 * FFLEN_2048);
+    FF_4096_fromOctet(c->u, &OCT, FFLEN_4096);
+
+    // Clean memory
+    FF_2048_zero(dws2, 2 * FFLEN_2048);
+    FF_2048_zero(ws1, HFLEN_2048);
+    FF_2048_zero(ws2, HFLEN_2048);
+    FF_2048_zero(ws3, HFLEN_2048);
+}
+
+void BIT_COMMITMENT_prove(PAILLIER_private_key *key, octet *X, octet *R, BIT_COMMITMENT_rv *rv, octet *E, BIT_COMMITMENT_proof *p)
+{
+    BIG_1024_58 ws1[FFLEN_2048];
+    BIG_1024_58 ws2[FFLEN_2048];
+    BIG_1024_58 hws[HFLEN_2048];
+
+    BIG_1024_58 r[2*FFLEN_2048];
+    BIG_1024_58 e[HFLEN_2048];
+    BIG_1024_58 m[HFLEN_2048];
+
+    BIG_1024_58 sp[HFLEN_2048];
+    BIG_1024_58 sq[HFLEN_2048];
+
+    char oct[2*FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Read inputs
+    OCT_copy(&OCT, X);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(m, &OCT, HFLEN_2048);
+
+    OCT_copy(&OCT, R);
+    FF_2048_fromOctet(r, &OCT, 2*FFLEN_2048);
+
+    OCT_copy(&OCT, E);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(e, &OCT, HFLEN_2048);
+
+    // Compute s = beta * r^e mod N using CRT
+    FF_2048_amod(hws, r, 2*FFLEN_2048, key->p, HFLEN_2048);
+    FF_2048_dmod(sp, rv->beta, key->p, HFLEN_2048);
+    FF_2048_nt_pow(hws, hws, e, key->p, HFLEN_2048, HFLEN_2048);
+    FF_2048_mul(ws1, sp, hws,  HFLEN_2048);
+    FF_2048_dmod(sp, ws1, key->p, HFLEN_2048);
+
+    FF_2048_amod(hws, r, 2*FFLEN_2048, key->q, HFLEN_2048);
+    FF_2048_dmod(sq, rv->beta, key->q, HFLEN_2048);
+    FF_2048_nt_pow(hws, hws, e, key->q, HFLEN_2048, HFLEN_2048);
+    FF_2048_mul(ws1, sq, hws,  HFLEN_2048);
+    FF_2048_dmod(sq, ws1, key->q, HFLEN_2048);
+
+    FF_2048_mul(ws2, key->p, key->q, HFLEN_2048);
+    FF_2048_crt(ws1, sp, sq, key->p, key->invpq, ws2, HFLEN_2048);
+
+    // Convert s to FF_4096 since it is only used as such
+    FF_2048_toOctet(&OCT, ws1, FFLEN_2048);
+    OCT_pad(&OCT, FS_4096);
+    FF_4096_fromOctet(p->s, &OCT, FFLEN_4096);
+
+    // Compute s1 = e*m + alpha
+    FF_2048_mul(ws1, e, m, HFLEN_2048);
+    FF_2048_copy(p->s1, rv->alpha, FFLEN_2048);
+    FF_2048_add(p->s1, p->s1, ws1, FFLEN_2048);
+    FF_2048_norm(p->s1, FFLEN_2048);
+
+    // Compute s2 = e*rho + gamma
+    FF_2048_amul(r, e, HFLEN_2048, rv->rho, FFLEN_2048 + HFLEN_2048);
+    FF_2048_copy(p->s2, rv->gamma, FFLEN_2048 + HFLEN_2048);
+    FF_2048_add(p->s2, p->s2, r, FFLEN_2048 + HFLEN_2048);
+    FF_2048_norm(p->s2, FFLEN_2048 + HFLEN_2048);
+
+    // Clean memory
+    FF_2048_zero(r, 2*FFLEN_2048);
+    FF_2048_zero(ws1, FFLEN_2048);
+    FF_2048_zero(ws2, FFLEN_2048);
+    FF_2048_zero(sp, HFLEN_2048);
+    FF_2048_zero(sq, HFLEN_2048);
+    FF_2048_zero(m, HFLEN_2048);
+}
+
+int BIT_COMMITMENT_verify(PAILLIER_public_key *key, BIT_COMMITMENT_priv *m, octet *CT, BIT_COMMITMENT_commitment *c, octet *E, BIT_COMMITMENT_proof *p)
+{
+    int fail;
+
+    BIG_1024_58 ws[FFLEN_2048];
+    BIG_1024_58 hws1[HFLEN_2048];
+    BIG_1024_58 hws2[HFLEN_2048];
+
+    BIG_1024_58 wp_proof[HFLEN_2048];
+    BIG_1024_58 wq_proof[HFLEN_2048];
+
+    BIG_1024_58 e[HFLEN_2048];
+
+    BIG_512_60 e_4096[HFLEN_4096];
+    BIG_512_60 s1[HFLEN_4096];
+    BIG_512_60 ws1_4096[FFLEN_4096];
+    BIG_512_60 ws2_4096[FFLEN_4096];
+    BIG_512_60 dws_4096[2 * FFLEN_4096];
+
+    char oct[FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Read challenge
+    OCT_copy(&OCT, E);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(e, &OCT, HFLEN_2048);
+    OCT_pad(&OCT, HFS_4096);
+    FF_4096_fromOctet(e_4096, &OCT, HFLEN_4096);
+
+    // Read q and compute q^3
+    OCT_fromHex(&OCT, curve_order_hex);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(hws1, &OCT, HFLEN_2048);
+    FF_2048_sqr(ws, hws1, HFLEN_2048);
+    FF_2048_mul(ws, ws, hws1, HFLEN_2048);
+
+    if (FF_2048_comp(p->s1, ws, FFLEN_2048) > 0)
+    {
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    // Split computation of proof for w using CRT.
+    BIT_COMMITMENT_triple_power(wp_proof, m->b0, m->b1, p->s1, p->s2, c->z, e, m->mod.p, false);
+    BIT_COMMITMENT_triple_power(wq_proof, m->b0, m->b1, p->s1, p->s2, c->z, e, m->mod.q, false);
+
+    // Reduce w mod P and Q for comparison
+    FF_2048_dmod(hws1, c->w, m->mod.p, HFLEN_2048);
+    FF_2048_dmod(hws2, c->w, m->mod.q, HFLEN_2048);
+
+    // Compare the results modulo P and Q
+    // since w == w' mod PQ <==> w == w' mod P & w == w' mod Q
+    fail = (FF_2048_comp(hws1, wp_proof, HFLEN_2048) != 0) || (FF_2048_comp(hws2, wq_proof, HFLEN_2048) != 0);
+
+    // Clean memory
+    FF_2048_zero(hws1, HFLEN_2048);
+    FF_2048_zero(hws2, HFLEN_2048);
+    FF_2048_zero(wp_proof, HFLEN_2048);
+    FF_2048_zero(wq_proof, HFLEN_2048);
+
+    if(fail)
+    {
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    // Compute verification for u
+    FF_2048_toOctet(&OCT, p->s1, HFLEN_2048);
+    OCT_pad(&OCT, HFS_4096);
+    FF_4096_fromOctet(s1, &OCT, HFLEN_4096);
+
+    FF_4096_fromOctet(ws1_4096, CT, FFLEN_4096);
+    FF_4096_invmodp(ws1_4096, ws1_4096, key->n2, FFLEN_4096);
+
+    // u_proof = g^s1 * s^N * c^(-e) mod N^2
+    FF_4096_mul(ws2_4096, key->n, s1, HFLEN_4096);
+    FF_4096_inc(ws2_4096, 1, FFLEN_4096);
+    FF_4096_norm(ws2_4096, FFLEN_4096);
+    FF_4096_nt_pow_2(ws1_4096, p->s, key->n, ws1_4096, e_4096, key->n2, FFLEN_4096, HFLEN_4096);
+    FF_4096_mul(dws_4096, ws1_4096, ws2_4096, FFLEN_4096);
+    FF_4096_dmod(ws1_4096, dws_4096, key->n2, FFLEN_4096);
+
+    if(FF_4096_comp(ws1_4096, c->u, FFLEN_4096) != 0)
+    {
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    return BIT_COMMITMENT_OK;
+}
+
+void BIT_COMMITMENT_commitment_toOctets(octet *Z, octet *U, octet *W, BIT_COMMITMENT_commitment *c)
+{
+    FF_2048_toOctet(Z, c->z, FFLEN_2048);
+    FF_4096_toOctet(U, c->u, FFLEN_4096);
+    FF_2048_toOctet(W, c->w, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_commitment_fromOctets(BIT_COMMITMENT_commitment *c, octet *Z, octet *U, octet *W)
+{
+    FF_2048_fromOctet(c->z, Z, FFLEN_2048);
+    FF_4096_fromOctet(c->u, U, FFLEN_4096);
+    FF_2048_fromOctet(c->w, W, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_proof_toOctets(octet *S, octet *S1, octet *S2, BIT_COMMITMENT_proof *p)
+{
+    FF_4096_toOctet(S,  p->s,  HFLEN_4096);
+    FF_2048_toOctet(S1, p->s1, HFLEN_2048);
+    FF_2048_toOctet(S2, p->s2, FFLEN_2048 + HFLEN_2048);
+}
+
+void BIT_COMMITMENT_proof_fromOctets(BIT_COMMITMENT_proof *p, octet *S, octet *S1, octet *S2)
+{
+    FF_2048_zero(p->s1, FFLEN_2048);
+    FF_4096_zero(p->s, FFLEN_4096);
+
+    FF_4096_fromOctet(p->s,  S,  HFLEN_4096);
+    FF_2048_fromOctet(p->s1, S1, HFLEN_2048);
+    FF_2048_fromOctet(p->s2, S2, FFLEN_2048 + HFLEN_2048);
+}
+
+void BIT_COMMITMENT_rv_kill(BIT_COMMITMENT_rv *rv)
+{
+    FF_2048_zero(rv->alpha, HFLEN_2048);
+    FF_2048_zero(rv->beta,  FFLEN_2048);
+    FF_2048_zero(rv->gamma, FFLEN_2048 + HFLEN_2048);
+    FF_2048_zero(rv->rho,   FFLEN_2048 + HFLEN_2048);
+}
+
+/* ZKP of Knowledge and range of Paillier homomorphic mul/add */
+
+void BIT_COMMITMENT_muladd_commit(csprng *RNG, PAILLIER_public_key *key, BIT_COMMITMENT_pub *m, octet *X, octet *Y, octet *C1, BIT_COMMITMENT_muladd_rv *rv, BIT_COMMITMENT_muladd_commitment *c)
+{
+    BIG_1024_58 q[HFLEN_2048];
+    BIG_1024_58 q3[FFLEN_2048];
+    BIG_1024_58 tws[FFLEN_2048 + HFLEN_2048];
+
+    BIG_512_60 alpha[HFLEN_4096];
+    BIG_512_60 beta[FFLEN_4096];
+    BIG_512_60 gamma[HFLEN_4096];
+    BIG_512_60 ws1[FFLEN_4096];
+    BIG_512_60 ws2[FFLEN_4096];
+    BIG_512_60 dws[2 * FFLEN_4096];
+
+    char oct[2 * FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Curve order
+    OCT_fromHex(&OCT, curve_order_hex);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(q, &OCT, HFLEN_2048);
+
+    // Zero out beta since it's needed regardless of RNG
+    FF_4096_zero(beta, FFLEN_4096);
+
+    if (RNG != NULL)
+    {
+        FF_2048_sqr(q3, q, HFLEN_2048);
+        FF_2048_mul(q3, q, q3, HFLEN_2048);
+
+        // Generate alpha in [0, .., q^3]
+        // See Remark 1 at the top for more information
+        FF_2048_zero(rv->alpha, FFLEN_2048);
+        FF_2048_random(rv->alpha, RNG, HFLEN_2048);
+        FF_2048_mod(rv->alpha, q3, HFLEN_2048);
+
+        // Generate beta in [0, .., N]
+        FF_4096_randomnum(beta, key->n, RNG, HFLEN_4096);
+        FF_4096_toOctet(&OCT, beta, HFLEN_4096);
+        FF_2048_fromOctet(rv->beta, &OCT, FFLEN_2048);
+
+        // Generate gamma in [0, .., N]
+        FF_4096_randomnum(gamma, key->n, RNG, HFLEN_4096);
+        FF_4096_toOctet(&OCT, gamma, HFLEN_4096);
+        FF_2048_fromOctet(rv->gamma, &OCT, FFLEN_2048);
+
+        // Generate rho, tau, sigma in [0, .., Nt * q]
+        // See Remark 1 at the top for more information
+        FF_2048_amul(tws, q, HFLEN_2048, m->N, FFLEN_2048);
+        FF_2048_random(rv->rho, RNG, FFLEN_2048 + HFLEN_2048);
+        FF_2048_mod(rv->rho, tws, FFLEN_2048 + HFLEN_2048);
+
+        FF_2048_random(rv->tau, RNG, FFLEN_2048 + HFLEN_2048);
+        FF_2048_mod(rv->tau, tws, FFLEN_2048 + HFLEN_2048);
+
+        FF_2048_random(rv->sigma, RNG, FFLEN_2048 + HFLEN_2048);
+        FF_2048_mod(rv->sigma, tws, FFLEN_2048 + HFLEN_2048);
+
+        // Generate rho1 in [0, .., Nt * q^3]
+        // See Remark 1 at the top for more information
+        FF_2048_amul(tws, q3, HFLEN_2048, m->N, FFLEN_2048);
+        FF_2048_random(rv->rho1, RNG, FFLEN_2048 + HFLEN_2048);
+        FF_2048_mod(rv->rho1, tws, FFLEN_2048 + HFLEN_2048);
+    }
+    else
+    {
+        FF_2048_toOctet(&OCT, rv->beta, FFLEN_2048);
+        FF_4096_fromOctet(beta, &OCT, HFLEN_4096);
+
+        FF_2048_toOctet(&OCT, rv->gamma, FFLEN_2048);
+        FF_4096_fromOctet(gamma, &OCT, HFLEN_4096);
+    }
+
+    // Compute z = h1^x * h2^rho mod Nt
+    OCT_copy(&OCT, X);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_zero(tws, FFLEN_2048 + HFLEN_2048);
+    FF_2048_fromOctet(tws, &OCT, HFLEN_2048);
+    FF_2048_ct_pow_2(c->z, m->b0, tws, m->b1, rv->rho, m->N, FFLEN_2048, FFLEN_2048 + HFLEN_2048);
+
+    // Compute t = h1^y * h2^sigma mod Nt
+    OCT_copy(&OCT, Y);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(tws, &OCT, HFLEN_2048);
+    FF_2048_ct_pow_2(c->t, m->b0, tws, m->b1, rv->sigma, m->N, FFLEN_2048, FFLEN_2048 + HFLEN_2048);
+
+    // Compute z1 = h1^alpha * h2^rho1 mod Nt and
+    FF_2048_copy(tws, rv->alpha, HFLEN_2048);
+    FF_2048_ct_pow_2(c->z1, m->b0, tws, m->b1, rv->rho1, m->N, FFLEN_2048, FFLEN_2048 + HFLEN_2048);
+
+    // Compute w = h1^gamma * h2^tau mod Nt
+    FF_2048_copy(tws, rv->gamma, FFLEN_2048);
+    FF_2048_ct_pow_2(c->w,  m->b0, tws, m->b1, rv->tau,  m->N, FFLEN_2048, FFLEN_2048 + HFLEN_2048);
+
+    // Compute v = c1^alpha * g^gamma * beta^N mod n2
+    FF_4096_fromOctet(ws2, C1, FFLEN_4096);
+
+    FF_2048_toOctet(&OCT, rv->alpha, HFLEN_2048);
+    OCT_pad(&OCT, HFS_4096);
+    FF_4096_fromOctet(alpha, &OCT, HFLEN_4096);
+
+    FF_4096_mul(ws1, key->n, gamma, HFLEN_4096);
+    FF_4096_inc(ws1, 1, FFLEN_4096);
+    FF_4096_norm(ws1, FFLEN_4096);
+    FF_4096_ct_pow_2(ws2, ws2, alpha, beta, key->n, key->n2, FFLEN_4096, HFLEN_4096);
+    FF_4096_mul(dws, ws1, ws2, FFLEN_4096);
+    FF_4096_dmod(ws1, dws, key->n2, FFLEN_4096);
+
+    FF_4096_toOctet(&OCT, ws1, FFLEN_4096);
+    FF_2048_fromOctet(c->v, &OCT, 2 * FFLEN_2048);
+
+    // Clean memory
+    FF_4096_zero(alpha, HFLEN_4096);
+    FF_4096_zero(beta,  FFLEN_4096);
+    FF_4096_zero(gamma, HFLEN_4096);
+}
+
+void BIT_COMMITMENT_muladd_prove(PAILLIER_public_key *key, octet *X, octet *Y, octet *R, BIT_COMMITMENT_muladd_rv *rv, octet *E, BIT_COMMITMENT_muladd_proof *p)
+{
+    BIG_1024_58 hws[HFLEN_2048];
+    BIG_1024_58 ws[FFLEN_2048];
+    BIG_1024_58 dws[2*FFLEN_2048];
+
+    BIG_1024_58 n[FFLEN_2048];
+    BIG_1024_58 e[HFLEN_2048];
+
+    char oct[2*FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    OCT_copy(&OCT, E);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(e, &OCT, HFLEN_2048);
+
+    // Compute s = beta * r^e mod N
+    OCT_copy(&OCT, R);
+    FF_2048_fromOctet(dws, &OCT, 2*FFLEN_2048);
+
+    FF_4096_toOctet(&OCT, key->n, HFLEN_4096);
+    FF_2048_fromOctet(n, &OCT, FFLEN_2048);
+
+    FF_2048_dmod(ws, dws, n, FFLEN_2048);
+    FF_2048_nt_pow(ws, ws, e, n, FFLEN_2048, HFLEN_2048);
+    FF_2048_mul(dws, rv->beta, ws, FFLEN_2048);
+    FF_2048_dmod(p->s, dws, n, FFLEN_2048);
+
+    // Compute s1 = e*x + alpha
+    OCT_copy(&OCT, X);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(hws, &OCT, HFLEN_2048);
+
+    FF_2048_zero(p->s1, FFLEN_2048);
+
+    FF_2048_mul(ws, e, hws, HFLEN_2048);
+    FF_2048_copy(p->s1, rv->alpha, HFLEN_2048);
+    FF_2048_add(p->s1, p->s1, ws, HFLEN_2048);
+    FF_2048_norm(p->s1, HFLEN_2048);
+
+    // Compute s2 = e*rho + rho1
+    FF_2048_amul(dws, e, HFLEN_2048, rv->rho, FFLEN_2048 + HFLEN_2048);
+    FF_2048_copy(p->s2, rv->rho1, FFLEN_2048 + HFLEN_2048);
+    FF_2048_add(p->s2, p->s2, dws, FFLEN_2048 + HFLEN_2048);
+    FF_2048_norm(p->s2, FFLEN_2048 + HFLEN_2048);
+
+    // Compute t1 = e*y + gamma
+    OCT_copy(&OCT, Y);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(hws, &OCT, HFLEN_2048);
+
+    FF_2048_mul(ws, e, hws, HFLEN_2048);
+    FF_2048_copy(p->t1, rv->gamma, FFLEN_2048);
+    FF_2048_add(p->t1, p->t1, ws, FFLEN_2048);
+    FF_2048_norm(p->t1, FFLEN_2048);
+
+    // Compute s2 = e*sigma + tau
+    FF_2048_amul(dws, e, HFLEN_2048, rv->sigma, FFLEN_2048 + HFLEN_2048);
+    FF_2048_copy(p->t2, rv->tau, FFLEN_2048 + HFLEN_2048);
+    FF_2048_add(p->t2, p->t2, dws, FFLEN_2048 + HFLEN_2048);
+    FF_2048_norm(p->t2, FFLEN_2048 + HFLEN_2048);
+
+    // Clean memory
+    FF_2048_zero(hws, HFLEN_2048);
+    FF_2048_zero(ws,  FFLEN_2048);
+    FF_2048_zero(dws, 2 * FFLEN_2048);
+}
+
+int BIT_COMMITMENT_muladd_verify(PAILLIER_private_key *key, BIT_COMMITMENT_priv *m, octet *C1, octet *C2, BIT_COMMITMENT_muladd_commitment *c, octet *E, BIT_COMMITMENT_muladd_proof *p)
+{
+    int fail;
+
+    BIG_1024_58 e[FFLEN_2048];
+    BIG_1024_58 q[HFLEN_2048];
+    BIG_1024_58 n[FFLEN_2048];
+
+    BIG_1024_58 p_proof[FFLEN_2048];
+    BIG_1024_58 q_proof[FFLEN_2048];
+    BIG_1024_58 p_gt[FFLEN_2048];
+    BIG_1024_58 q_gt[FFLEN_2048];
+
+    BIG_1024_58 c1[2 * FFLEN_2048];
+    BIG_1024_58 c2[2 * FFLEN_2048];
+
+    BIG_1024_58 ws1[FFLEN_2048];
+    BIG_1024_58 ws2[FFLEN_2048];
+    BIG_1024_58 ws3[FFLEN_2048];
+
+    BIG_1024_58 dws[2 * FFLEN_2048];
+
+    char oct[2*FS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    // Check if s1 < q^3
+    OCT_fromHex(&OCT, curve_order_hex);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(q, &OCT, HFLEN_2048);
+    FF_2048_sqr(ws1, q, HFLEN_2048);
+    FF_2048_mul(ws1, ws1, q, HFLEN_2048);
+
+    if (FF_2048_comp(p->s1, ws1, HFLEN_2048) > 0)
+    {
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    OCT_copy(&OCT, E);
+    OCT_pad(&OCT, FS_2048);
+    FF_2048_fromOctet(e, &OCT, FFLEN_2048);
+
+    // Split check b0^s1 * b1^s2 * z^(-e) == z1 mod PQ using CRT
+    BIT_COMMITMENT_triple_power(p_proof, m->b0, m->b1, p->s1, p->s2, c->z, e, m->mod.p, false);
+    BIT_COMMITMENT_triple_power(q_proof, m->b0, m->b1, p->s1, p->s2, c->z, e, m->mod.q, false);
+
+    FF_2048_dmod(p_gt, c->z1, m->mod.p, HFLEN_2048);
+    FF_2048_dmod(q_gt, c->z1, m->mod.q, HFLEN_2048);
+
+    fail = (FF_2048_comp(p_gt, p_proof, HFLEN_2048) != 0) || (FF_2048_comp(q_gt, q_proof, HFLEN_2048) != 0);
+
+    if (fail)
+    {
+        // Clean memory
+        FF_2048_zero(p_gt, HFLEN_2048);
+        FF_2048_zero(q_gt, HFLEN_2048);
+        FF_2048_zero(p_proof, HFLEN_2048);
+        FF_2048_zero(q_proof, HFLEN_2048);
+
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    // Split check if b0^t1 * b1^t2 * t^(-e) == w mod PQ using CRT
+    BIT_COMMITMENT_triple_power(p_proof, m->b0, m->b1, p->t1, p->t2, c->t, e, m->mod.p, 1);
+    BIT_COMMITMENT_triple_power(q_proof, m->b0, m->b1, p->t1, p->t2, c->t, e, m->mod.q, 1);
+
+    FF_2048_dmod(p_gt, c->w, m->mod.p, HFLEN_2048);
+    FF_2048_dmod(q_gt, c->w, m->mod.q, HFLEN_2048);
+
+    fail = (FF_2048_comp(p_gt, p_proof, HFLEN_2048) != 0) || (FF_2048_comp(q_gt, q_proof, HFLEN_2048) != 0);
+
+    if (fail)
+    {
+        // Clean memory
+        FF_2048_zero(p_gt, HFLEN_2048);
+        FF_2048_zero(q_gt, HFLEN_2048);
+        FF_2048_zero(p_proof, HFLEN_2048);
+        FF_2048_zero(q_proof, HFLEN_2048);
+
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    // Split check c1^s1 * s^N * g^t1 * c2^(-e) == v mod N^2 using CRT
+    FF_2048_mul(n, key->p, key->q, HFLEN_2048);
+
+    FF_2048_fromOctet(c1, C1, 2 * FFLEN_2048);
+    FF_2048_fromOctet(c2, C2, 2 * FFLEN_2048);
+
+    // Compute check modulo p^2
+    FF_2048_copy(ws3, key->p2, FFLEN_2048);
+    FF_2048_zero(ws1, FFLEN_2048);
+    FF_2048_copy(ws1, key->p, HFLEN_2048);
+    FF_2048_sub(ws3, ws3, ws1, FFLEN_2048);
+    FF_2048_sub(ws3, ws3, e, FFLEN_2048);
+    FF_2048_norm(ws3, FFLEN_2048);
+
+    FF_2048_dmod(ws1, c1, key->p2, FFLEN_2048);
+    FF_2048_dmod(ws2, c2, key->p2, FFLEN_2048);
+
+    FF_2048_ct_pow_3(p_proof, ws1, p->s1, p->s, n, ws2, ws3, key->p2, FFLEN_2048, FFLEN_2048);
+
+    FF_2048_mul(dws, n, p->t1, FFLEN_2048);
+    FF_2048_dmod(ws1, dws, key->p2, FFLEN_2048);
+    FF_2048_inc(ws1, 1, FFLEN_2048);
+    FF_2048_norm(ws1, FFLEN_2048);
+
+    FF_2048_mul(dws, p_proof, ws1, FFLEN_2048);
+    FF_2048_dmod(p_proof, dws, key->p2, FFLEN_2048);
+
+    // Compute check modulo q^2
+    FF_2048_copy(ws3, key->q2, FFLEN_2048);
+    FF_2048_zero(ws1, FFLEN_2048);
+    FF_2048_copy(ws1, key->q, HFLEN_2048);
+    FF_2048_sub(ws3, ws3, ws1, FFLEN_2048);
+    FF_2048_sub(ws3, ws3, e, FFLEN_2048);
+    FF_2048_norm(ws3, FFLEN_2048);
+
+    FF_2048_dmod(ws1, c1, key->q2, FFLEN_2048);
+    FF_2048_dmod(ws2, c2, key->q2, FFLEN_2048);
+
+    FF_2048_ct_pow_3(q_proof, ws1, p->s1, p->s, n, ws2, ws3, key->q2, FFLEN_2048, FFLEN_2048);
+
+    FF_2048_mul(dws, n, p->t1, FFLEN_2048);
+    FF_2048_dmod(ws1, dws, key->q2, FFLEN_2048);
+    FF_2048_inc(ws1, 1, FFLEN_2048);
+
+    FF_2048_mul(dws, q_proof, ws1, FFLEN_2048);
+    FF_2048_dmod(q_proof, dws, key->q2, FFLEN_2048);
+
+    FF_2048_dmod(p_gt, c->v, key->p2, FFLEN_2048);
+    FF_2048_dmod(q_gt, c->v, key->q2, FFLEN_2048);
+
+    fail = (FF_2048_comp(p_gt, p_proof, FFLEN_2048) != 0) || (FF_2048_comp(q_gt, q_proof, FFLEN_2048) != 0);
+
+    // Clean memory
+    FF_2048_zero(p_gt, FFLEN_2048);
+    FF_2048_zero(q_gt, FFLEN_2048);
+    FF_2048_zero(p_proof, FFLEN_2048);
+    FF_2048_zero(q_proof, FFLEN_2048);
+    FF_2048_zero(ws1, FFLEN_2048);
+    FF_2048_zero(ws2, FFLEN_2048);
+    FF_2048_zero(ws3, FFLEN_2048);
+    FF_2048_zero(dws, 2 * FFLEN_2048);
+
+    if (fail)
+    {
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    return BIT_COMMITMENT_OK;
+}
+
+void BIT_COMMITMENT_muladd_commitment_toOctets(octet *Z, octet *Z1, octet *T, octet *V, octet *W, BIT_COMMITMENT_muladd_commitment *c)
+{
+    FF_2048_toOctet(Z,  c->z,  FFLEN_2048);
+    FF_2048_toOctet(Z1, c->z1, FFLEN_2048);
+    FF_2048_toOctet(T,  c->t,  FFLEN_2048);
+    FF_2048_toOctet(V,  c->v,  2 * FFLEN_2048);
+    FF_2048_toOctet(W,  c->w,  FFLEN_2048);
+}
+
+void BIT_COMMITMENT_muladd_commitment_fromOctets(BIT_COMMITMENT_muladd_commitment *c, octet *Z, octet *Z1, octet *T, octet *V, octet *W)
+{
+    FF_2048_fromOctet(c->z,  Z,  FFLEN_2048);
+    FF_2048_fromOctet(c->z1, Z1, FFLEN_2048);
+    FF_2048_fromOctet(c->t,  T,  FFLEN_2048);
+    FF_2048_fromOctet(c->v,  V,  2 * FFLEN_2048);
+    FF_2048_fromOctet(c->w,  W,  FFLEN_2048);
+}
+
+void BIT_COMMITMENT_muladd_proof_toOctets(octet *S, octet *S1, octet *S2, octet *T1, octet *T2, BIT_COMMITMENT_muladd_proof *p)
+{
+    FF_2048_toOctet(S,  p->s,  FFLEN_2048);
+    FF_2048_toOctet(S1, p->s1, HFLEN_2048);
+    FF_2048_toOctet(S2, p->s2, FFLEN_2048 + HFLEN_2048);
+    FF_2048_toOctet(T1, p->t1, FFLEN_2048);
+    FF_2048_toOctet(T2, p->t2, FFLEN_2048 + HFLEN_2048);
+}
+
+void BIT_COMMITMENT_muladd_proof_fromOctets(BIT_COMMITMENT_muladd_proof *p, octet *S, octet *S1, octet *S2, octet *T1, octet *T2)
+{
+    FF_2048_zero(p->s1, FFLEN_2048);
+
+    FF_2048_fromOctet(p->s,  S,  FFLEN_2048);
+    FF_2048_fromOctet(p->s1,  S1, HFLEN_2048);
+    FF_2048_fromOctet(p->s2, S2, FFLEN_2048 + HFLEN_2048);
+    FF_2048_fromOctet(p->t1, T1, FFLEN_2048);
+    FF_2048_fromOctet(p->t2, T2, FFLEN_2048 + HFLEN_2048);
+}
+
+void BIT_COMMITMENT_muladd_rv_kill(BIT_COMMITMENT_muladd_rv *rv)
+{
+    FF_2048_zero(rv->alpha, HFLEN_2048);
+    FF_2048_zero(rv->beta,  FFLEN_2048);
+    FF_2048_zero(rv->gamma, FFLEN_2048);
+    FF_2048_zero(rv->rho,   FFLEN_2048 + HFLEN_2048);
+    FF_2048_zero(rv->rho1,  FFLEN_2048 + HFLEN_2048);
+    FF_2048_zero(rv->sigma, FFLEN_2048 + HFLEN_2048);
+    FF_2048_zero(rv->tau,   FFLEN_2048 + HFLEN_2048);
+}
+
+/* ZKP of knowledge of DLOG */
+
+void BIT_COMMITMENT_ECP_commit(ECP_SECP256K1 *G, BIG_1024_58 *alpha)
+{
+    BIG_1024_58 ff_alpha[HFLEN_2048];
+    BIG_1024_58 ff_q[HFLEN_2048];
+
+    BIG_256_56 eg_alpha;
+
+    char oct[HFS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+    char oct_alpha[EGS_SECP256K1];
+    octet ALPHA = {0, sizeof(oct_alpha), oct_alpha};
+
+    // Reduce alpha modulo curve order
+    OCT_fromHex(&OCT, curve_order_hex);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(ff_q, &OCT, HFLEN_2048);
+
+    FF_2048_copy(ff_alpha, alpha, HFLEN_2048);
+    FF_2048_mod(ff_alpha, ff_q, HFLEN_2048);
+    FF_2048_toOctet(&OCT, ff_alpha, HFLEN_2048);
+    OCT_chop(&OCT, &ALPHA, HFS_2048 - EGS_SECP256K1);
+    BIG_256_56_fromBytesLen(eg_alpha, ALPHA.val, ALPHA.len);
+
+    // Commit to U = alpha.G
+    ECP_SECP256K1_mul(G, eg_alpha);
+}
+
+int BIT_COMMITMENT_ECP_verify(ECP_SECP256K1 *G, ECP_SECP256K1 *X, ECP_SECP256K1 *U, octet *E, BIG_1024_58 *s1)
+{
+    BIG_256_56 e;
+    BIG_256_56 eg_s1;
+
+    BIG_1024_58 ff_s1[HFLEN_2048];
+    BIG_1024_58 ff_q[HFLEN_2048];
+
+    char oct[HFS_2048];
+    octet OCT = {0, sizeof(oct), oct};
+
+    char oct_s1[EGS_SECP256K1];
+    octet S1 = {0, sizeof(oct_s1), oct_s1};
+
+    /* Verify knowldege of DLOG X = x.G */
+
+    BIG_256_56_fromBytesLen(e, E->val, E->len);
+
+    // Reduce s1 modulo curve order
+    OCT_fromHex(&OCT, curve_order_hex);
+    OCT_pad(&OCT, HFS_2048);
+    FF_2048_fromOctet(ff_q, &OCT, HFLEN_2048);
+
+    FF_2048_copy(ff_s1, s1, HFLEN_2048);
+    FF_2048_mod(ff_s1, ff_q, HFLEN_2048);
+    FF_2048_toOctet(&OCT, ff_s1, HFLEN_2048);
+    OCT_chop(&OCT, &S1, HFS_2048 - EGS_SECP256K1);
+    BIG_256_56_fromBytesLen(eg_s1, S1.val, S1.len);
+
+    // Check U = s1.G - e.X
+    ECP_SECP256K1_neg(X);
+    ECP_SECP256K1_mul2(X, G, e, eg_s1);
+
+    if (!ECP_SECP256K1_equals(X, U))
+    {
+        return BIT_COMMITMENT_FAIL;
+    }
+
+    return BIT_COMMITMENT_OK;
+}
diff --git a/src/bit_commitment_setup.c b/src/bit_commitment_setup.c
new file mode 100644
index 0000000..0def8ab
--- /dev/null
+++ b/src/bit_commitment_setup.c
@@ -0,0 +1,356 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+#include "amcl/bit_commitment_setup.h"
+
+
+/* Bit Commitment Setup Definitions */
+
+/*
+ * Check if a number is a safe prime
+ */
+static int is_safe_prime(BIG_1024_58 *p, BIG_1024_58 *P, csprng *RNG, int n)
+{
+#ifndef C99
+    BIG_1024_58 Pm1[FFLEN_2048];
+    BIG_1024_58 f[FFLEN_2048];
+#else
+    BIG_1024_58 Pm1[n];
+    BIG_1024_58 f[n];
+#endif
+
+    // Sieve small primes from P, p is already checked in Miller-Rabin
+    sign32 sf=4849845;/* 3*5*.. *19 */
+
+    if(FF_2048_cfactor(P, sf, n))
+    {
+        return 0;
+    }
+
+    // Check primality of p
+    if (FF_2048_prime(p, RNG, n) == 0)
+    {
+        return 0;
+    }
+
+    // Simplified primality check for safe primes using
+    // Pocklington's criterion
+    //
+    // If p is prime, P = 2p+1, 2^(P-1) = 1 mod P, then P is prime
+    FF_2048_init(f, 2, n);
+    FF_2048_copy(Pm1, P, n);
+    FF_2048_dec(Pm1, 1, n);
+
+    FF_2048_nt_pow(f, f, Pm1, P, n, n);
+    FF_2048_dec(f, 1, n);
+    if (FF_2048_iszilch(f, n))
+    {
+        return 1;
+    }
+
+    return 0;
+}
+
+/*
+ * Generate a safe prime P, such that P = 2 * p + 1
+ * n is the size of P in BIGs
+ */
+void generate_safe_prime(csprng *RNG, BIG_1024_58 *p, BIG_1024_58 *P, int n)
+{
+#ifndef C99
+    BIG_1024_58 r[HFLEN_2048];
+    BIG_1024_58 twelve[HFLEN_2048];
+#else
+    BIG_1024_58 r[n];
+    BIG_1024_58 twelve[n];
+#endif
+    FF_2048_init(twelve, 12, n);
+
+    FF_2048_random(p, RNG, n);
+    FF_2048_shr(p, n);
+
+    // Make sure p = 11 mod 12
+    //
+    // p == 3 mod 4 for library
+    // p == 2 mod 3 otherwise 3 | P
+    //
+    // Naive check for now. We can probably benefit from a custom mod3
+    // sum((-1)^i * xi mod 3) that spits an integer
+    // so we can do the lastbits check + mod3 check but this is negligible
+    // compared to the search time
+    FF_2048_copy(r, p, n);
+    FF_2048_mod(r, twelve, n);
+    FF_2048_inc(p, 11, n);
+    FF_2048_sub(p, p, r, n);
+
+    // P = 2p + 1
+    FF_2048_copy(P, p, n);
+    FF_2048_shl(P, n);
+    FF_2048_inc(P, 1, n);
+
+    while (!is_safe_prime(p, P, RNG, n))
+    {
+        // Increase p by 12 to keep it = 11 mod 12, P grows as 2*p
+        FF_2048_inc(p, 12, n);
+        FF_2048_inc(P, 24, n);
+    }
+}
+
+/*
+ * Find random element of order p in Z/PZ
+ * Assuming P = 2p + 1 is a safe prime, i.e. phi(P) = 2p
+ */
+void bc_generator(csprng *RNG, BIG_1024_58* x, BIG_1024_58 *P, int n)
+{
+#ifndef C99
+    BIG_1024_58 r[FFLEN_2048];
+#else
+    BIG_1024_58 r[n];
+#endif
+
+    FF_2048_randomnum(r, P, RNG, n);
+
+    do
+    {
+        FF_2048_nt_pow_int(x, r, 2, P, n);
+        FF_2048_inc(r, 1, n);
+    }
+    while (FF_2048_isunity(x, n));
+}
+
+void BIT_COMMITMENT_setup(csprng *RNG, BIT_COMMITMENT_priv *m, octet *P, octet *Q, octet *B0, octet *ALPHA)
+{
+    BIG_1024_58 p[HFLEN_2048];
+    BIG_1024_58 q[HFLEN_2048];
+    BIG_1024_58 gp[HFLEN_2048];
+    BIG_1024_58 gq[HFLEN_2048];
+    BIG_1024_58 ap[HFLEN_2048];
+    BIG_1024_58 aq[HFLEN_2048];
+
+    /* Load or generate safe primes P, Q */
+
+    if (P == NULL)
+    {
+        generate_safe_prime(RNG, p, m->mod.p, HFLEN_2048);
+    }
+    else
+    {
+        FF_2048_fromOctet(m->mod.p, P, HFLEN_2048);
+        FF_2048_copy(p, m->mod.p, HFLEN_2048);
+
+        // Since P is odd, P>>1 == (P-1) / 2
+        FF_2048_shr(p, HFLEN_2048);
+    }
+
+    if (Q == NULL)
+    {
+        generate_safe_prime(RNG, q, m->mod.q, HFLEN_2048);
+    }
+    else
+    {
+        FF_2048_fromOctet(m->mod.q, Q, HFLEN_2048);
+        FF_2048_copy(q, m->mod.q, HFLEN_2048);
+
+        // Since Q is odd, Q>>1 == (Q-1) / 2
+        FF_2048_shr(q, HFLEN_2048);
+    }
+
+    FF_2048_mul(m->mod.n, m->mod.p, m->mod.q, HFLEN_2048);
+    FF_2048_mul(m->pq, p, q, HFLEN_2048);
+    FF_2048_invmodp(m->mod.invpq, m->mod.p, m->mod.q, HFLEN_2048);
+
+    /* Load or generate generator b0 and DLOG exponent alpha */
+
+    if (B0 == NULL)
+    {
+        // Find a generator of G_pq in Z/NZ using the crt to
+        // combine generators of G_p in Z/PZ and G_q in Z/QZ
+        bc_generator(RNG, gp, m->mod.p, HFLEN_2048);
+        bc_generator(RNG, gq, m->mod.q, HFLEN_2048);
+
+        FF_2048_crt(m->b0, gp, gq, m->mod.p, m->mod.invpq, m->mod.n, HFLEN_2048);
+    }
+    else
+    {
+        FF_2048_fromOctet(m->b0, B0, FFLEN_2048);
+
+        FF_2048_dmod(gp, m->b0, m->mod.p, HFLEN_2048);
+        FF_2048_dmod(gq, m->b0, m->mod.q, HFLEN_2048);
+    }
+
+    if (ALPHA == NULL)
+    {
+        FF_2048_randomnum(m->alpha, m->pq, RNG, FFLEN_2048);
+
+        // Look for invertible alpha and precompute inverse
+        FF_2048_invmodp(m->ialpha, m->alpha, m->pq, FFLEN_2048);
+        while (FF_2048_iszilch(m->ialpha, FFLEN_2048))
+        {
+            FF_2048_inc(m->alpha, 1, FFLEN_2048);
+            FF_2048_invmodp(m->ialpha, m->alpha, m->pq, FFLEN_2048);
+        }
+    }
+    else
+    {
+        // Load alpha and precompute inverse
+        FF_2048_fromOctet(m->alpha, ALPHA, FFLEN_2048);
+        FF_2048_invmodp(m->ialpha, m->alpha, m->pq, FFLEN_2048);
+    }
+
+    /* Compute b1 as b0 to the alpha using CRT */
+
+    FF_2048_dmod(ap, m->alpha, p, HFLEN_2048);
+    FF_2048_dmod(aq, m->alpha, q, HFLEN_2048);
+
+    FF_2048_ct_pow(gp, gp, ap, m->mod.p, HFLEN_2048, HFLEN_2048);
+    FF_2048_ct_pow(gq, gq, aq, m->mod.q, HFLEN_2048, HFLEN_2048);
+
+    FF_2048_crt(m->b1, gp, gq, m->mod.p, m->mod.invpq, m->mod.n, HFLEN_2048);
+
+    // Clean memory
+    FF_2048_zero(p,  HFLEN_2048);
+    FF_2048_zero(q,  HFLEN_2048);
+    FF_2048_zero(gp, HFLEN_2048);
+    FF_2048_zero(gq, HFLEN_2048);
+    FF_2048_zero(ap, HFLEN_2048);
+    FF_2048_zero(aq, HFLEN_2048);
+}
+
+void BIT_COMMITMENT_priv_fromOctets(BIT_COMMITMENT_priv *m, octet *P, octet *Q, octet *B0, octet * ALPHA)
+{
+    BIT_COMMITMENT_setup(NULL, m, P, Q, B0, ALPHA);
+}
+
+void BIT_COMMITMENT_priv_toOctets(octet *P, octet *Q, octet *B0, octet * ALPHA, BIT_COMMITMENT_priv *m)
+{
+    MODULUS_toOctets(P, Q, &m->mod);
+    FF_2048_toOctet(B0, m->b0, FFLEN_2048);
+    FF_2048_toOctet(ALPHA, m->alpha, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_priv_kill(BIT_COMMITMENT_priv *m)
+{
+    MODULUS_kill(&m->mod);
+    FF_2048_zero(m->pq, FFLEN_2048);
+    FF_2048_zero(m->alpha, FFLEN_2048);
+    FF_2048_zero(m->ialpha, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_priv_to_pub(BIT_COMMITMENT_pub *pub, BIT_COMMITMENT_priv *priv)
+{
+    FF_2048_copy(pub->b0, priv->b0, FFLEN_2048);
+    FF_2048_copy(pub->b1, priv->b1, FFLEN_2048);
+    FF_2048_copy(pub->N, priv->mod.n, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_pub_fromOctets(BIT_COMMITMENT_pub *m, octet *N, octet *B0, octet *B1)
+{
+    FF_2048_fromOctet(m->N,  N,  FFLEN_2048);
+    FF_2048_fromOctet(m->b0, B0, FFLEN_2048);
+    FF_2048_fromOctet(m->b1, B1, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_pub_toOctets(octet *N, octet *B0, octet *B1, BIT_COMMITMENT_pub *m)
+{
+    FF_2048_toOctet(N,  m->N,  FFLEN_2048);
+    FF_2048_toOctet(B0, m->b0, FFLEN_2048);
+    FF_2048_toOctet(B1, m->b1, FFLEN_2048);
+}
+
+void BIT_COMMITMENT_setup_prove(csprng *RNG, BIT_COMMITMENT_priv *m, BIT_COMMITMENT_setup_proof *p, octet *ID, octet *AD)
+{
+    HDLOG_iter_values R;
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+
+    // Prove b1 = b0^alpha
+    HDLOG_commit(RNG, &m->mod, m->pq, m->b0, R, p->rho);
+    HDLOG_challenge(m->mod.n, m->b0, m->b1, p->rho, ID, AD, &E);
+    HDLOG_prove(m->pq, m->alpha, R, &E, p->t);
+
+    // Prove b0 = b1 ^ ialpha
+    HDLOG_commit(RNG, &m->mod, m->pq, m->b1, R, p->irho);
+    HDLOG_challenge(m->mod.n, m->b1, m->b0, p->irho, ID, AD, &E);
+    HDLOG_prove(m->pq, m->ialpha, R, &E, p->it);
+
+    // Clean memory
+    HDLOG_iter_values_kill(R);
+}
+
+int BIT_COMMITMENT_setup_verify(BIT_COMMITMENT_pub *m, BIT_COMMITMENT_setup_proof *p, octet *ID, octet *AD)
+{
+    int rc;
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+
+    // Verify knowledge of DLOG of b1
+    HDLOG_challenge(m->N, m->b0, m->b1, p->rho, ID, AD, &E);
+    rc = HDLOG_verify(m->N, m->b0, m->b1, p->rho, &E, p->t);
+    if (rc != HDLOG_OK)
+    {
+        printf("%d\n", rc);
+        return BIT_COMMITMENT_INVALID_PROOF + 100;
+    }
+
+    // Verify knowledge of DLOG of b0
+    HDLOG_challenge(m->N, m->b1, m->b0, p->irho, ID, AD, &E);
+    rc = HDLOG_verify(m->N, m->b1, m->b0, p->irho, &E, p->it);
+    if (rc != HDLOG_OK)
+    {
+        printf("%d\n", rc);
+        return BIT_COMMITMENT_INVALID_PROOF;
+    }
+
+    return BIT_COMMITMENT_OK;
+}
+
+int BIT_COMMITMENT_setup_proof_fromOctets(BIT_COMMITMENT_setup_proof *p, octet *RHO, octet *IRHO, octet *T, octet *IT)
+{
+    if (HDLOG_iter_values_fromOctet(p->rho, RHO) != HDLOG_OK)
+    {
+        return BIT_COMMITMENT_INVALID_FORMAT;
+    }
+
+    if (HDLOG_iter_values_fromOctet(p->irho, IRHO) != HDLOG_OK)
+    {
+        return BIT_COMMITMENT_INVALID_FORMAT;
+    }
+
+    if (HDLOG_iter_values_fromOctet(p->t, T) != HDLOG_OK)
+    {
+        return BIT_COMMITMENT_INVALID_FORMAT;
+    }
+
+    if (HDLOG_iter_values_fromOctet(p->it, IT) != HDLOG_OK)
+    {
+        return BIT_COMMITMENT_INVALID_FORMAT;
+    }
+
+    return BIT_COMMITMENT_OK;
+}
+
+void BIT_COMMITMENT_setup_proof_toOctets(octet *RHO, octet *IRHO, octet *T, octet *IT, BIT_COMMITMENT_setup_proof *p)
+{
+    HDLOG_iter_values_toOctet(RHO,  p->rho);
+    HDLOG_iter_values_toOctet(IRHO, p->irho);
+    HDLOG_iter_values_toOctet(T,    p->t);
+    HDLOG_iter_values_toOctet(IT,   p->it);
+}
diff --git a/src/commitments.c b/src/commitments.c
deleted file mode 100644
index d908a44..0000000
--- a/src/commitments.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-#include "amcl/commitments.h"
-
-/* NM Commitments Definitions */
-
-// Compute the hash of X || R
-static void hash(const octet *X, const octet *R, octet *C)
-{
-    int i;
-    hash256 sha256;
-
-    HASH256_init(&sha256);
-
-    // Process X
-    for (i = 0; i < X->len; i++)
-    {
-        HASH256_process(&sha256, X->val[i]);
-    }
-
-    // Process R
-    for (i = 0; i < R->len; i++)
-    {
-        HASH256_process(&sha256, R->val[i]);
-    }
-
-    // Output the digest in C
-    HASH256_hash(&sha256, C->val);
-    C->len = SHA256;
-}
-
-// Compute a commitment for the value X
-void COMMITMENTS_NM_commit(csprng *RNG, const octet *X, octet *R, octet *C)
-{
-    if (RNG != NULL)
-    {
-        OCT_rand(R, RNG, SHA256);
-    }
-
-    hash(X, R, C);
-}
-
-// Verify the commitment for the value X
-int COMMITMENTS_NM_decommit(const octet *X, const octet *R, octet *C)
-{
-    char d[SHA256];
-    octet D = {0, sizeof(d), d};
-
-    // Validate the length of R. This step MUST be performed
-    // to make the scheme non malleable
-    if (R->len != SHA256)
-    {
-        return COMMITMENTS_FAIL;
-    }
-
-    // Verify the commitment
-    hash(X, R, &D);
-
-    if (!OCT_comp(C, &D))
-    {
-        return COMMITMENTS_FAIL;
-    }
-
-    return COMMITMENTS_OK;
-}
-
-/* Bit Commitment Setup Definitions */
-
-/*
- * Check if a number is a safe prime
- */
-static int is_safe_prime(BIG_1024_58 *p, BIG_1024_58 *P, csprng *RNG, int n)
-{
-#ifndef C99
-    BIG_1024_58 Pm1[FFLEN_2048];
-    BIG_1024_58 f[FFLEN_2048];
-#else
-    BIG_1024_58 Pm1[n];
-    BIG_1024_58 f[n];
-#endif
-
-    // Sieve small primes from P, p is already checked in Miller-Rabin
-    sign32 sf=4849845;/* 3*5*.. *19 */
-
-    if(FF_2048_cfactor(P, sf, n))
-    {
-        return 0;
-    }
-
-    // Check primality of p
-    if (FF_2048_prime(p, RNG, n) == 0)
-    {
-        return 0;
-    }
-
-    // Simplified primality check for safe primes using
-    // Pocklington's criterion
-    //
-    // If p is prime, P = 2p+1, 2^(P-1) = 1 mod P, then P is prime
-    FF_2048_init(f, 2, n);
-    FF_2048_copy(Pm1, P, n);
-    FF_2048_dec(Pm1, 1, n);
-
-    FF_2048_nt_pow(f, f, Pm1, P, n, n);
-    FF_2048_dec(f, 1, n);
-    if (FF_2048_iszilch(f, n))
-    {
-        return 1;
-    }
-
-    return 0;
-}
-
-/*
- * Generate a safe prime P, such that P = 2 * p + 1
- * n is the size of P in BIGs
- */
-void generate_safe_prime(csprng *RNG, BIG_1024_58 *p, BIG_1024_58 *P, int n)
-{
-    int lastbits;
-
-    FF_2048_random(p, RNG, n);
-    FF_2048_shr(p, n);
-
-    // Make sure p = 3 mod 4
-    lastbits = FF_2048_lastbits(p, 2);
-    FF_2048_inc(p, 3 - lastbits, n);
-
-    // P = 2p + 1
-    FF_2048_copy(P, p, n);
-    FF_2048_shl(P, n);
-    FF_2048_inc(P, 1, n);
-
-    while (!is_safe_prime(p, P, RNG, n))
-    {
-        // Increase p by 4 to keep it = 3 mod 4, P grows as 2*p
-        FF_2048_inc(p, 4, n);
-        FF_2048_inc(P, 8, n);
-    }
-}
-
-/*
- * Find random element of order p in Z/PZ
- * Assuming P = 2p + 1 is a safe prime, i.e. phi(P) = 2p
- */
-void bc_generator(csprng *RNG, BIG_1024_58* x, BIG_1024_58 *P, int n)
-{
-#ifndef C99
-    BIG_1024_58 r[FFLEN_2048];
-#else
-    BIG_1024_58 r[n];
-#endif
-
-    FF_2048_randomnum(r, P, RNG, n);
-
-    do
-    {
-        FF_2048_nt_pow_int(x, r, 2, P, n);
-        FF_2048_inc(r, 1, n);
-    }
-    while (FF_2048_isunity(x, n));
-}
-
-void COMMITMENTS_BC_setup(csprng *RNG, COMMITMENTS_BC_priv_modulus *m, octet *P, octet *Q, octet *B0, octet *ALPHA)
-{
-    BIG_1024_58 p[HFLEN_2048];
-    BIG_1024_58 q[HFLEN_2048];
-    BIG_1024_58 gp[HFLEN_2048];
-    BIG_1024_58 gq[HFLEN_2048];
-    BIG_1024_58 ap[HFLEN_2048];
-    BIG_1024_58 aq[HFLEN_2048];
-
-    /* Load or generate safe primes P, Q */
-
-    if (P == NULL)
-    {
-        generate_safe_prime(RNG, p, m->P, HFLEN_2048);
-    }
-    else
-    {
-        FF_2048_fromOctet(m->P, P, HFLEN_2048);
-        FF_2048_copy(p, m->P, HFLEN_2048);
-
-        // Since P is odd, P>>1 == (P-1) / 2
-        FF_2048_shr(p, HFLEN_2048);
-    }
-
-    if (Q == NULL)
-    {
-        generate_safe_prime(RNG, q, m->Q, HFLEN_2048);
-    }
-    else
-    {
-        FF_2048_fromOctet(m->Q, Q, HFLEN_2048);
-        FF_2048_copy(q, m->Q, HFLEN_2048);
-
-        // Since Q is odd, Q>>1 == (Q-1) / 2
-        FF_2048_shr(q, HFLEN_2048);
-    }
-
-    FF_2048_mul(m->N, m->P, m->Q, HFLEN_2048);
-    FF_2048_mul(m->pq, p, q, HFLEN_2048);
-    FF_2048_invmodp(m->invPQ, m->P, m->Q, HFLEN_2048);
-
-    /* Load or generate generator b0 and DLOG exponent alpha */
-
-    if (B0 == NULL)
-    {
-        // Find a generator of G_pq in Z/NZ using the crt to
-        // combine generators of G_p in Z/PZ and G_q in Z/QZ
-        bc_generator(RNG, gp, m->P, HFLEN_2048);
-        bc_generator(RNG, gq, m->Q, HFLEN_2048);
-
-        FF_2048_crt(m->b0, gp, gq, m->P, m->invPQ, m->N, HFLEN_2048);
-    }
-    else
-    {
-        FF_2048_fromOctet(m->b0, B0, FFLEN_2048);
-
-        FF_2048_dmod(gp, m->b0, m->P, HFLEN_2048);
-        FF_2048_dmod(gq, m->b0, m->Q, HFLEN_2048);
-    }
-
-    if (ALPHA == NULL)
-    {
-        FF_2048_randomnum(m->alpha, m->pq, RNG, FFLEN_2048);
-
-        // Look for invertible alpha and precompute inverse
-        FF_2048_invmodp(m->ialpha, m->alpha, m->pq, FFLEN_2048);
-        while (FF_2048_iszilch(m->ialpha, FFLEN_2048))
-        {
-            FF_2048_inc(m->alpha, 1, FFLEN_2048);
-            FF_2048_invmodp(m->ialpha, m->alpha, m->pq, FFLEN_2048);
-        }
-    }
-    else
-    {
-        // Load alpha and precompute inverse
-        FF_2048_fromOctet(m->alpha, ALPHA, FFLEN_2048);
-        FF_2048_invmodp(m->ialpha, m->alpha, m->pq, FFLEN_2048);
-    }
-
-    /* Compute b1 as b0 to the alpha using CRT */
-
-    FF_2048_dmod(ap, m->alpha, p, HFLEN_2048);
-    FF_2048_dmod(aq, m->alpha, q, HFLEN_2048);
-
-    FF_2048_ct_pow(gp, gp, ap, m->P, HFLEN_2048, HFLEN_2048);
-    FF_2048_ct_pow(gq, gq, aq, m->Q, HFLEN_2048, HFLEN_2048);
-
-    FF_2048_crt(m->b1, gp, gq, m->P, m->invPQ, m->N, HFLEN_2048);
-
-    // Clean memory
-    FF_2048_zero(p,  HFLEN_2048);
-    FF_2048_zero(q,  HFLEN_2048);
-    FF_2048_zero(gp, HFLEN_2048);
-    FF_2048_zero(gq, HFLEN_2048);
-    FF_2048_zero(ap, HFLEN_2048);
-    FF_2048_zero(aq, HFLEN_2048);
-}
-
-void COMMITMENTS_BC_kill_priv_modulus(COMMITMENTS_BC_priv_modulus *m)
-{
-    FF_2048_zero(m->P, HFLEN_2048);
-    FF_2048_zero(m->Q, HFLEN_2048);
-    FF_2048_zero(m->invPQ, HFLEN_2048);
-    FF_2048_zero(m->pq, FFLEN_2048);
-    FF_2048_zero(m->alpha, FFLEN_2048);
-    FF_2048_zero(m->ialpha, FFLEN_2048);
-}
-
-void COMMITMENTS_BC_export_public_modulus(COMMITMENTS_BC_pub_modulus *pub, COMMITMENTS_BC_priv_modulus *priv)
-{
-    FF_2048_copy(pub->b0, priv->b0, FFLEN_2048);
-    FF_2048_copy(pub->b1, priv->b1, FFLEN_2048);
-    FF_2048_copy(pub->N, priv->N, FFLEN_2048);
-}
diff --git a/src/hash_utils.c b/src/hash_utils.c
new file mode 100644
index 0000000..084d6b2
--- /dev/null
+++ b/src/hash_utils.c
@@ -0,0 +1,106 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+#include <string.h>
+#include "amcl/hash_utils.h"
+#include "amcl/ff_2048.h"
+
+/* Hash utilities for pseudo-random challenges generation */
+
+// Chunks necessary for the sampling mod FF.
+// Sampling double the necessary chunks to remove bias
+#define HASH_UTILS_FF_CHUNKS 2 * FS_2048 / SHA256
+
+
+// Copy the internal state of an hash function
+void HASH_UTILS_hash_copy(hash256 *dst, const hash256 *src)
+{
+    memcpy(dst->length, src->length, sizeof(dst->length));
+    memcpy(dst->h, src->h, sizeof(dst->h));
+    memcpy(dst->w, src->w, sizeof(dst->w));
+    dst->hlen = src->hlen;
+}
+
+// utility function to hash an octet
+void HASH_UTILS_hash_oct(hash256 *sha, const octet *O)
+{
+    int i;
+
+    for (i = 0; i < O->len; i++)
+    {
+        HASH256_process(sha, O->val[i]);
+    }
+}
+
+void HASH_UTILS_hash_i2osp4(hash256 *sha, const int i)
+{
+    HASH256_process(sha, (i >> 24) & 0xFF);
+    HASH256_process(sha, (i >> 16) & 0xFF);
+    HASH256_process(sha, (i >> 8) & 0xFF);
+    HASH256_process(sha, i & 0xFF);
+}
+
+// Sample mod n using MGF1 using SHA256 and sampling double the
+// amount of necesary random data to make bias negligible
+void HASH_UTILS_sample_mod_FF(hash256 *sha, BIG_1024_58 *n, BIG_1024_58 *x)
+{
+    int i;
+    hash256 shai;
+
+    char w[2 * FS_2048];
+    octet W = {0, sizeof(w), w};
+
+    BIG_1024_58 dws[2 * FFLEN_2048];
+
+    for (i = 0; i < HASH_UTILS_FF_CHUNKS; i++)
+    {
+        // Compute partial hash of SEED || I2OSP(i, 4)
+        HASH_UTILS_hash_copy(&shai, sha);
+        HASH_UTILS_hash_i2osp4(&shai, i);
+
+        // Append the digest to the ouptut octet
+        HASH256_hash(&shai, W.val + W.len);
+        W.len+=SHA256;
+    }
+
+    // Reduce modulo n
+    FF_2048_fromOctet(dws, &W, 2 * FFLEN_2048);
+    FF_2048_dmod(x, dws, n, FFLEN_2048);
+}
+
+void HASH_UTILS_rejection_sample_mod_BIG(hash256 *sha, BIG_256_56 q, BIG_256_56 x)
+{
+    hash256 shai;
+
+    char digest[SHA256];
+
+    int attempt = 0;
+
+    do
+    {
+        HASH_UTILS_hash_copy(&shai, sha);
+        HASH_UTILS_hash_i2osp4(&shai, attempt);
+
+        HASH256_hash(&shai, digest);
+        BIG_256_56_fromBytesLen(x, digest, SHA256);
+
+        attempt++;
+    }
+    while(BIG_256_56_comp(x, q) >= 0);
+}
diff --git a/src/hidden_dlog.c b/src/hidden_dlog.c
new file mode 100644
index 0000000..913b16a
--- /dev/null
+++ b/src/hidden_dlog.c
@@ -0,0 +1,275 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+#include "amcl/hidden_dlog.h"
+#include "amcl/hash_utils.h"
+
+/* Definitions for ZKPoK of a DLOG in a hidden order group */
+
+// Window and table size for CT precomputation
+// using 2^w ary method
+#define C_WINDOW 4
+#define C_SIZE 1 << C_WINDOW
+
+// Widnow and table size for non CT precomputation
+// using basic interleaving
+#define N_WINDOW 5
+#define N_SIZE 1 << (N_WINDOW - 1)
+
+void HDLOG_commit(csprng *RNG, MODULUS_priv *m, BIG_1024_58 *ord, BIG_1024_58 *B0, HDLOG_iter_values R, HDLOG_iter_values RHO)
+{
+    int i;
+
+    BIG_1024_58 fm1[HFLEN_2048];
+    BIG_1024_58 rhoq[HFLEN_2048];
+    BIG_1024_58 ND[HFLEN_2048];
+
+    BIG_1024_58 ws[HFLEN_2048];
+    BIG_1024_58 *WS[] = {ws};
+
+    BIG_1024_58 T_mem[C_SIZE][HFLEN_2048];
+    BIG_1024_58 *T[C_SIZE] = {0};
+
+    for (i = 0; i < C_SIZE; i++)
+    {
+        T[i] = T_mem[i];
+    }
+
+    // Generate random values for commitments
+    if (RNG != NULL)
+    {
+        for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+        {
+            FF_2048_randomnum(R[i], ord, RNG, FFLEN_2048);
+        }
+    }
+
+    // Compute exponents B0^R mod P for later use in CRT
+    FF_2048_copy(fm1, m->p, HFLEN_2048);
+    FF_2048_dec(fm1, 1, HFLEN_2048);
+
+    FF_2048_dmod(ws, B0, m->p, HFLEN_2048);
+
+    FF_2048_invmod2m(ND, m->p, HFLEN_2048);
+    FF_2048_2w_precompute(WS, T, 1, C_WINDOW, m->p, ND, HFLEN_2048);
+
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        FF_2048_dmod(ws, R[i], fm1, HFLEN_2048);
+        FF_2048_ct_2w_pow(RHO[i], T, WS, 1, C_WINDOW, m->p, ND, HFLEN_2048, HFLEN_2048);
+    }
+
+    // Compute exponents B0^R mod Q and recombine using CRT
+    FF_2048_dmod(ws, B0, m->q, HFLEN_2048);
+    FF_2048_invmod2m(ND, m->q, HFLEN_2048);
+    FF_2048_2w_precompute(WS, T, 1, C_WINDOW, m->q, ND, HFLEN_2048);
+
+    FF_2048_copy(fm1, m->q, HFLEN_2048);
+    FF_2048_dec(fm1, 1, HFLEN_2048);
+
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        FF_2048_dmod(ws, R[i], fm1, HFLEN_2048);
+        FF_2048_ct_2w_pow(rhoq, T, WS, 1, C_WINDOW, m->q, ND, HFLEN_2048, HFLEN_2048);
+
+        FF_2048_crt(RHO[i], RHO[i], rhoq, m->p, m->invpq, m->n, HFLEN_2048);
+    }
+
+    // Clean memory
+    FF_2048_zero(fm1,  HFLEN_2048);
+    FF_2048_zero(ws,   HFLEN_2048);
+    FF_2048_zero(rhoq, HFLEN_2048);
+    FF_2048_zero(ND,   HFLEN_2048);
+}
+
+
+void HDLOG_challenge(BIG_1024_58 *N, BIG_1024_58 *B0, BIG_1024_58 *B1, HDLOG_iter_values RHO, const octet *ID, const octet *AD, octet *E)
+{
+    hash256 sha;
+
+    int i;
+
+    char w[FS_2048];
+    octet W = {0, sizeof(w), w};
+
+    HASH256_init(&sha);
+
+    // Bind the public parameters
+    FF_2048_toOctet(&W, N, FFLEN_2048);
+    HASH_UTILS_hash_oct(&sha, &W);
+    FF_2048_toOctet(&W, B0, FFLEN_2048);
+    HASH_UTILS_hash_oct(&sha, &W);
+    FF_2048_toOctet(&W, B1, FFLEN_2048);
+    HASH_UTILS_hash_oct(&sha, &W);
+
+    // Bind to commitment
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        FF_2048_toOctet(&W, RHO[i], FFLEN_2048);
+        HASH_UTILS_hash_oct(&sha, &W);
+    }
+
+    // Bind to ID and optional AD
+    HASH_UTILS_hash_i2osp4(&sha, ID->len);
+    HASH_UTILS_hash_oct(&sha, ID);
+
+    if (AD != NULL)
+    {
+        HASH_UTILS_hash_i2osp4(&sha, AD->len);
+        HASH_UTILS_hash_oct(&sha, AD);
+    }
+
+    HASH256_hash(&sha, w);
+
+    OCT_clear(E);
+    OCT_jbytes(E, w, HDLOG_CHALLENGE_SIZE);
+}
+
+void HDLOG_prove(BIG_1024_58 *ord, BIG_1024_58 *alpha, HDLOG_iter_values R, octet *E, HDLOG_iter_values T)
+{
+    int i;
+    int mask;
+
+    BIG_1024_58 alphaneg[FFLEN_2048];
+
+    FF_2048_sub(alphaneg, ord, alpha, FFLEN_2048);
+
+    for (i = 0; i < HDLOG_CHALLENGE_SIZE; i++)
+    {
+        mask = 0x80;
+        while (mask)
+        {
+            FF_2048_copy(*T, *R, FFLEN_2048);
+
+            // No need to be constant time over the value of E
+            // since it is public
+            if (E->val[i] & mask)
+            {
+                FF_2048_add(*T, *T, alphaneg, FFLEN_2048);
+                FF_2048_mod(*T, ord, FFLEN_2048);
+            }
+
+            // Advance mask and iter values
+            mask>>=1;
+            R++;
+            T++;
+        }
+    }
+}
+
+
+int HDLOG_verify(BIG_1024_58 *N, BIG_1024_58 *B0, BIG_1024_58 *B1, HDLOG_iter_values RHO, octet *E, HDLOG_iter_values T)
+{
+    int i;
+    int mask;
+
+    BIG_1024_58 ws[FFLEN_2048];
+    BIG_1024_58 dws[2 * FFLEN_2048];
+    BIG_1024_58 ND[FFLEN_2048];
+
+    BIG_1024_58 PT_mem[N_SIZE][FFLEN_2048];
+    BIG_1024_58 *PT[N_SIZE];
+
+    for (i = 0; i < N_SIZE; i++)
+    {
+        PT[i] = PT_mem[i];
+    }
+
+    FF_2048_invmod2m(ND, N, FFLEN_2048);
+    FF_2048_bi_precompute(&B0, PT, 1, N_WINDOW, N, ND, FFLEN_2048);
+
+    for (i = 0; i < HDLOG_CHALLENGE_SIZE; i++)
+    {
+        mask = 0x80;
+        while (mask)
+        {
+            FF_2048_bi_pow(ws, PT, (BIG_1024_58 **)(&T), 1, N_WINDOW, N, ND, FFLEN_2048, FFLEN_2048);
+
+            // No need to be constant time over the value of E
+            // since it is public
+            if (E->val[i] & mask)
+            {
+                FF_2048_mul(dws, ws, B1, FFLEN_2048);
+                FF_2048_dmod(ws, dws, N, FFLEN_2048);
+            }
+
+            if (FF_2048_comp(ws, *RHO, FFLEN_2048))
+            {
+                return HDLOG_FAIL;
+            }
+
+            // Advance mask and iter values
+            mask>>=1;
+            RHO++;
+            T++;
+        }
+    }
+
+    return HDLOG_OK;
+}
+
+void HDLOG_iter_values_toOctet(octet *O, HDLOG_iter_values v)
+{
+    int i;
+
+    char w[FS_2048];
+    octet W = {0, sizeof(w), w};
+
+    OCT_clear(O);
+
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        FF_2048_toOctet(&W, v[i], FFLEN_2048);
+        OCT_joctet(O, &W);
+    }
+}
+
+int HDLOG_iter_values_fromOctet(HDLOG_iter_values v, octet *O)
+{
+    int i;
+
+    char w[FS_2048];
+    octet W = {0, sizeof(w), w};
+
+    if (O->len != HDLOG_VALUES_SIZE)
+    {
+        return HDLOG_INVALID_VALUES;
+    }
+
+    for (i = HDLOG_PROOF_ITERS - 1; i >= 0; i--)
+    {
+        OCT_chop(O, &W, O->len - FS_2048);
+        FF_2048_fromOctet(v[i], &W, FFLEN_2048);
+    }
+
+    // Restore length of O
+    O->len = HDLOG_VALUES_SIZE;
+
+    return HDLOG_OK;
+}
+
+void HDLOG_iter_values_kill(HDLOG_iter_values v)
+{
+    int i;
+
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        FF_2048_zero(v[i], FFLEN_2048);
+    }
+}
diff --git a/test/smoke/test_nm_commit_smoke.c b/src/modulus.c
similarity index 53%
copy from test/smoke/test_nm_commit_smoke.c
copy to src/modulus.c
index 548092f..806757e 100644
--- a/test/smoke/test_nm_commit_smoke.c
+++ b/src/modulus.c
@@ -17,40 +17,28 @@ specific language governing permissions and limitations
 under the License.
 */
 
-/* NM commitment smoke test */
+/* Modulus declarations */
 
-#include <stdio.h>
-#include "amcl/commitments.h"
+#include "amcl/modulus.h"
 
-int main()
+void MODULUS_kill(MODULUS_priv *m)
 {
-    int rc;
-
-    char x[32];
-    octet X = {0, sizeof(x), x};
-
-    char r[SHA256];
-    octet R = {0, sizeof(r), r};
-
-    char c[SHA256];
-    octet C = {0, sizeof(c), c};
-
-    // Deterministic RNG for testing
-    char seed[32] = {0};
-    csprng RNG;
-    RAND_seed(&RNG, 32, seed);
-
-    OCT_rand(&X, &RNG, X.max);
+    FF_2048_zero(m->p,     HFLEN_2048);
+    FF_2048_zero(m->q,     HFLEN_2048);
+    FF_2048_zero(m->invpq, HFLEN_2048);
+}
 
-    COMMITMENTS_NM_commit(&RNG, &X, &R, &C);
+void MODULUS_fromOctets(MODULUS_priv *m, octet *P, octet *Q)
+{
+    FF_2048_fromOctet(m->p, P, HFLEN_2048);
+    FF_2048_fromOctet(m->q, Q, HFLEN_2048);
 
-    rc = COMMITMENTS_NM_decommit(&X, &R, &C);
-    if (rc != COMMITMENTS_OK)
-    {
-        fprintf(stderr, "FAILURE COMMITMENTS_NM_decommit.\n");
-        exit(EXIT_FAILURE);
-    }
+    FF_2048_mul(m->n, m->p, m->q, HFLEN_2048);
+    FF_2048_invmodp(m->invpq, m->p, m->q, HFLEN_2048);
+}
 
-    printf("SUCCESS\n");
-    exit(EXIT_SUCCESS);
+void MODULUS_toOctets(octet *P, octet *Q, MODULUS_priv *m)
+{
+    FF_2048_toOctet(P, m->p, HFLEN_2048);
+    FF_2048_toOctet(Q, m->q, HFLEN_2048);
 }
diff --git a/src/nm_commitment.c b/src/nm_commitment.c
new file mode 100644
index 0000000..25129f1
--- /dev/null
+++ b/src/nm_commitment.c
@@ -0,0 +1,82 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+#include "amcl/nm_commitment.h"
+
+/* NM Commitment Definitions */
+
+// Compute the hash of X || R
+static void hash(const octet *X, const octet *R, octet *C)
+{
+    int i;
+    hash256 sha256;
+
+    HASH256_init(&sha256);
+
+    // Process X
+    for (i = 0; i < X->len; i++)
+    {
+        HASH256_process(&sha256, X->val[i]);
+    }
+
+    // Process R
+    for (i = 0; i < R->len; i++)
+    {
+        HASH256_process(&sha256, R->val[i]);
+    }
+
+    // Output the digest in C
+    HASH256_hash(&sha256, C->val);
+    C->len = SHA256;
+}
+
+// Compute a commitment for the value X
+void NM_COMMITMENT_commit(csprng *RNG, const octet *X, octet *R, octet *C)
+{
+    if (RNG != NULL)
+    {
+        OCT_rand(R, RNG, SHA256);
+    }
+
+    hash(X, R, C);
+}
+
+// Verify the commitment for the value X
+int NM_COMMITMENT_decommit(const octet *X, const octet *R, octet *C)
+{
+    char d[SHA256];
+    octet D = {0, sizeof(d), d};
+
+    // Validate the length of R. This step MUST be performed
+    // to make the scheme non malleable
+    if (R->len != SHA256)
+    {
+        return NM_COMMITMENT_FAIL;
+    }
+
+    // Verify the commitment
+    hash(X, R, &D);
+
+    if (!OCT_comp(C, &D))
+    {
+        return NM_COMMITMENT_FAIL;
+    }
+
+    return NM_COMMITMENT_OK;
+}
diff --git a/test/smoke/test_bit_commitment_muladd_smoke.c b/test/smoke/test_bit_commitment_muladd_smoke.c
new file mode 100644
index 0000000..a718cf8
--- /dev/null
+++ b/test/smoke/test_bit_commitment_muladd_smoke.c
@@ -0,0 +1,148 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+/* Bit commitment muladd test */
+
+#include <string.h>
+#include "amcl/bit_commitment.h"
+
+void ff_2048_cleaned(BIG_1024_58 *a, char *name, int n)
+{
+    if(!FF_2048_iszilch(a, n))
+    {
+        fprintf(stderr, "FAILURE BIT_COMMITMENT_muladd_rv_kill. %s was not cleaned\n", name);
+        exit(EXIT_FAILURE);
+    }
+}
+
+// Primes for Paillier key
+char *P_hex = "94f689d07ba20cf7c7ca7ccbed22ae6b40c426db74eaee4ce0ced2b6f52a5e136663f5f1ef379cdbb0c4fdd6e4074d6cff21082d4803d43d89e42fd8dfa82b135aa31a8844ffea25f255f956cbc1b9d8631d01baf1010d028a190b94ce40f3b72897e8196df19edf1ff62e6556f2701d52cef1442e3301db7608ecbdcca703db";
+char *Q_hex = "9a9ad73f246df853e129c589925fdad9df05606a61081e62e72be4fb33f6e5ec492cc734f28bfb71fbe2ba9a11e4c02e2c0d103a5cbb0a9d6402c07de63b1b995dd72ac8f29825d66923a088b421fb4d52b0b855d2f5dde2be9b0ca0cee6f7a94e5566735fe6cff1fcad3199602f88528d19aa8d0263adff8f5053c38254a2a3";
+
+// Safe primes for BC setup
+char *PT_hex = "CA5F37B7C0DDF6530B30A41116588218DE95F1F36B807FD7C28E4C467EE3F35967BC01D28B71F8A627A353675A81C86A1FF03DCECAF1686891183FA317BA34A4A1148D40A89F1F3AC0C200511C6CFE02342CD75354C25A2E069886DD4FB73BD365660D163F1282B143119AB8F375A73875EC16B634F52593B73BC6D875F2D3EF";
+char *QT_hex = "C2FC545C1C803F6C7625FBC4ECF9355734D6B6058FD714816D3ECFB93F1F705C9CE90D4F8796A05148AB5ABC201F90889231CC6BF5F68ED15EE4D901F603930A280EEABF10C613BFCB67A816363C839EB902B02607EB48AB8325E2B72620D4D294A232803217090DFB50AF8C620D4679E77CE3053437ED518F4F68840DCF1AA3";
+
+// Paillier ciphertext and plaintext
+char* X_hex = "0000000000000000000000000000000000000000000000000000000000000003";
+char* Y_hex = "0000000000000000000000000000000000000000000000000000000000000004";
+char* C1_hex = "19c8b725dbd74b7dcaf72bd9ff2cd207b47cb1095393685906171af9e2f2959e7f68729e0e40f97a22bbca93373d618ad51dd077c0d102938598a8ecc8a656e978ebd14007da99db8e691d85fc18a428097ee8a63dcf95b84b660294474a20ed2edcf2b1b4f305c1cc25860a08d1348c2a4d24cc1a97b51f920e2985b8108b3392a5eafc443cf3449e288eb49dbde2228a56233afa5a6643e5ae6ec6aa8937a666ef74a30625c35bb22c3cc57b700f8eae7690f8d37edbfd27ccb2e882f70d0d85e0cc825347453a28e98e877ab1eeaa6efa09f034bc8976bffb86420106978066ff52221b315f71eb32cbf608d2 [...]
+char* C2_hex = "1f1f087e749c85aacdacaace8659a33b53baad5eec1e56628435d335a8b150f96865d6e090f53146e120e7089b6f4a91c762622b24d0d2fba0e703301170a0b826a1336d4d6bb83dccd29ad9ef0936614bf14e992ea4daa202c63ace9bd3f95b9a8a6edd7949e89ec165541e7c01bd41395baf3e2fe7f3a9611af8b5ed8639c02a2bfc236c17a136bef6d09f966db718f3df9d6f4f40b618b4b6058b4e4ec241e6c2424404d0aee0ef5cd666e5c4253a62ae9deb09289fb84657109e0b933f58871ba7ea77190d6ea45a04be68360478adf43a85851cf583c5575543578635996d2dcd020aeceabf18be6ff8b45e [...]
+char* R_hex = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...]
+
+int main()
+{
+    int rc;
+
+    PAILLIER_private_key priv_key;
+    PAILLIER_public_key  pub_key;
+
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
+
+    BIT_COMMITMENT_muladd_commitment c;
+    BIT_COMMITMENT_muladd_rv         rv;
+    BIT_COMMITMENT_muladd_proof      proof;
+
+    char c1[2*FS_2048];
+    octet C1 = {0, sizeof(c1), c1};
+
+    char c2[2*FS_2048];
+    octet C2 = {0, sizeof(c2), c2};
+
+    char r[2*FS_2048];
+    octet R = {0, sizeof(r), r};
+
+    char x[MODBYTES_256_56];
+    octet X = {0, sizeof(x), x};
+
+    char y[MODBYTES_256_56];
+    octet Y = {0, sizeof(y), y};
+
+    char e[MODBYTES_256_56];
+    octet E = {0, sizeof(e), e};
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
+    // Deterministic RNG for testing
+    char seed[32] = {0};
+    csprng RNG;
+    RAND_seed(&RNG, 32, seed);
+
+    // Pseudorandom ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
+    // Load paillier key
+    OCT_fromHex(&P, P_hex);
+    OCT_fromHex(&Q, Q_hex);
+
+    PAILLIER_KEY_PAIR(NULL, &P, &Q, &pub_key, &priv_key);
+
+    // Generate BC commitment modulus
+    OCT_fromHex(&P, PT_hex);
+    OCT_fromHex(&Q, QT_hex);
+    BIT_COMMITMENT_setup(&RNG, &priv_mod, &P, &Q, NULL, NULL);
+
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
+
+    // Load Paillier encryption values
+    OCT_fromHex(&X,  X_hex);
+    OCT_fromHex(&Y,  Y_hex);
+    OCT_fromHex(&R,  R_hex);
+    OCT_fromHex(&C1, C1_hex);
+    OCT_fromHex(&C2, C2_hex);
+
+    // Random challenge for testing
+    OCT_rand(&E, &RNG, E.max);
+
+    // Run smoke test
+    BIT_COMMITMENT_muladd_commit(&RNG, &pub_key, &pub_mod, &X, &Y, &C1, &rv, &c);
+    BIT_COMMITMENT_muladd_prove(&pub_key, &X, &Y, &R, &rv, &E, &proof);
+
+    rc = BIT_COMMITMENT_muladd_verify(&priv_key, &priv_mod, &C1, &C2, &c, &E, &proof);
+    if (rc != BIT_COMMITMENT_OK)
+    {
+        printf("FAILURE BIT_COMMITMENT_muladd_verify smoke test. rc = %d\n", rc);
+        exit(EXIT_FAILURE);
+    }
+
+    // Clean random values
+    BIT_COMMITMENT_muladd_rv_kill(&rv);
+
+    ff_2048_cleaned(rv.alpha, "rv.alpha", FFLEN_2048);
+    ff_2048_cleaned(rv.beta,  "rv.beta",  FFLEN_2048);
+    ff_2048_cleaned(rv.gamma, "rv.gamma", FFLEN_2048);
+    ff_2048_cleaned(rv.rho,   "rv.rho",   FFLEN_2048 + HFLEN_2048);
+    ff_2048_cleaned(rv.sigma, "rv.sigma", FFLEN_2048 + HFLEN_2048);
+    ff_2048_cleaned(rv.tau,   "rv.tau",   FFLEN_2048 + HFLEN_2048);
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/smoke/test_bc_setup_smoke.c b/test/smoke/test_bit_commitment_setup_smoke.c
similarity index 54%
rename from test/smoke/test_bc_setup_smoke.c
rename to test/smoke/test_bit_commitment_setup_smoke.c
index 52f965b..99beb6c 100644
--- a/test/smoke/test_bc_setup_smoke.c
+++ b/test/smoke/test_bit_commitment_setup_smoke.c
@@ -17,10 +17,10 @@ specific language governing permissions and limitations
 under the License.
 */
 
-/* NM commitment smoke test */
+/* Bit commitment setup smoke test */
 
 #include <stdio.h>
-#include "amcl/commitments.h"
+#include "amcl/bit_commitment_setup.h"
 
 char *Phex = "CA5F37B7C0DDF6530B30A41116588218DE95F1F36B807FD7C28E4C467EE3F35967BC01D28B71F8A627A353675A81C86A1FF03DCECAF1686891183FA317BA34A4A1148D40A89F1F3AC0C200511C6CFE02342CD75354C25A2E069886DD4FB73BD365660D163F1282B143119AB8F375A73875EC16B634F52593B73BC6D875F2D3EF";
 char *Qhex = "C2FC545C1C803F6C7625FBC4ECF9355734D6B6058FD714816D3ECFB93F1F705C9CE90D4F8796A05148AB5ABC201F90889231CC6BF5F68ED15EE4D901F603930A280EEABF10C613BFCB67A816363C839EB902B02607EB48AB8325E2B72620D4D294A232803217090DFB50AF8C620D4679E77CE3053437ED518F4F68840DCF1AA3";
@@ -29,23 +29,36 @@ void ff_2048_cleaned(BIG_1024_58 *a, char *name, int n)
 {
     if(!FF_2048_iszilch(a, n))
     {
-        fprintf(stderr, "FAILURE COMMITMENTS_BC_kill_priv_modulus. %s was not cleaned\n", name);
+        fprintf(stderr, "FAILURE BIT_COMMITMENT_priv_kill. %s was not cleaned\n", name);
         exit(EXIT_FAILURE);
     }
 }
 
 int main()
 {
+    int rc;
+
     char p[HFS_2048];
     octet P = {0, sizeof(p), p};
 
     char q[HFS_2048];
     octet Q = {0, sizeof(q), q};
 
-    COMMITMENTS_BC_priv_modulus m;
+    BIT_COMMITMENT_priv priv;
 
     BIG_1024_58 e[FFLEN_2048];
 
+    // Material for proof
+    BIT_COMMITMENT_pub pub;
+
+    BIT_COMMITMENT_setup_proof proof;
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     // Load values
     OCT_fromHex(&P, Phex);
     OCT_fromHex(&Q, Qhex);
@@ -55,32 +68,47 @@ int main()
     csprng RNG;
     RAND_seed(&RNG, 32, seed);
 
-    COMMITMENTS_BC_setup(&RNG, &m, &P, &Q, NULL, NULL);
+    // Generate ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
+    BIT_COMMITMENT_setup(&RNG, &priv, &P, &Q, NULL, NULL);
 
     // Check that b0, b1, alpha, ialpha are of the correct form
-    FF_2048_nt_pow(e, m.b0, m.alpha, m.N, FFLEN_2048, FFLEN_2048);
-    if (FF_2048_comp(e, m.b1, FFLEN_2048) != 0)
+    FF_2048_nt_pow(e, priv.b0, priv.alpha, priv.mod.n, FFLEN_2048, FFLEN_2048);
+    if (FF_2048_comp(e, priv.b1, FFLEN_2048) != 0)
     {
-        printf("FAILURE COMMITMENTS_BC_setup. b1 != b0^alpha");
+        printf("FAILURE BIT_COMMITMENT_setup. b1 != b0^alpha");
         exit(EXIT_FAILURE);
     }
 
-    FF_2048_nt_pow(e, m.b1, m.ialpha, m.N, FFLEN_2048, FFLEN_2048);
-    if (FF_2048_comp(e, m.b0, FFLEN_2048) != 0)
+    FF_2048_nt_pow(e, priv.b1, priv.ialpha, priv.mod.n, FFLEN_2048, FFLEN_2048);
+    if (FF_2048_comp(e, priv.b0, FFLEN_2048) != 0)
+    {
+        printf("FAILURE BIT_COMMITMENT_setup. b0 != b1^ialpha");
+        exit(EXIT_FAILURE);
+    }
+
+    // Prove b0, b1, n are of the correct form
+    BIT_COMMITMENT_setup_prove(&RNG, &priv, &proof, &ID, &AD);
+    BIT_COMMITMENT_priv_to_pub(&pub, &priv);
+    rc = BIT_COMMITMENT_setup_verify(&pub, &proof, &ID, &AD);
+
+    if (rc != BIT_COMMITMENT_OK)
     {
-        printf("FAILURE COMMITMENTS_BC_setup. b0 != b1^ialpha");
+        printf("FAILURE BIT_COMMITMENT_setup_verify smoke test. error code %d\n", rc);
         exit(EXIT_FAILURE);
     }
 
-    COMMITMENTS_BC_kill_priv_modulus(&m);
+    BIT_COMMITMENT_priv_kill(&priv);
 
     // Check that modulus was correctly killed
-    ff_2048_cleaned(m.P,      "P",      HFLEN_2048);
-    ff_2048_cleaned(m.Q,      "Q",      HFLEN_2048);
-    ff_2048_cleaned(m.invPQ,  "invPQ",  HFLEN_2048);
-    ff_2048_cleaned(m.pq,     "pq",     FFLEN_2048);
-    ff_2048_cleaned(m.alpha,  "alpha",  FFLEN_2048);
-    ff_2048_cleaned(m.ialpha, "ialpha", FFLEN_2048);
+    ff_2048_cleaned(priv.mod.p,      "P",      HFLEN_2048);
+    ff_2048_cleaned(priv.mod.q,      "Q",      HFLEN_2048);
+    ff_2048_cleaned(priv.mod.invpq,  "invPQ",  HFLEN_2048);
+    ff_2048_cleaned(priv.pq,         "pq",     FFLEN_2048);
+    ff_2048_cleaned(priv.alpha,      "alpha",  FFLEN_2048);
+    ff_2048_cleaned(priv.ialpha,     "ialpha", FFLEN_2048);
 
     printf("SUCCESS\n");
     exit(EXIT_SUCCESS);
diff --git a/test/smoke/test_bit_commitment_smoke.c b/test/smoke/test_bit_commitment_smoke.c
new file mode 100644
index 0000000..fdd8809
--- /dev/null
+++ b/test/smoke/test_bit_commitment_smoke.c
@@ -0,0 +1,150 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* Bit commitment and additional DLOG smoke test */
+
+#include <stdio.h>
+#include "amcl/bit_commitment.h"
+
+void ff_2048_cleaned(BIG_1024_58 *a, char *name, int n)
+{
+    if(!FF_2048_iszilch(a, n))
+    {
+        fprintf(stderr, "FAILURE BIT_COMMITMENT_rv_kill. %s was not cleaned\n", name);
+        exit(EXIT_FAILURE);
+    }
+}
+
+// Primes for Paillier key
+char *P_hex = "94f689d07ba20cf7c7ca7ccbed22ae6b40c426db74eaee4ce0ced2b6f52a5e136663f5f1ef379cdbb0c4fdd6e4074d6cff21082d4803d43d89e42fd8dfa82b135aa31a8844ffea25f255f956cbc1b9d8631d01baf1010d028a190b94ce40f3b72897e8196df19edf1ff62e6556f2701d52cef1442e3301db7608ecbdcca703db";
+char *Q_hex = "9a9ad73f246df853e129c589925fdad9df05606a61081e62e72be4fb33f6e5ec492cc734f28bfb71fbe2ba9a11e4c02e2c0d103a5cbb0a9d6402c07de63b1b995dd72ac8f29825d66923a088b421fb4d52b0b855d2f5dde2be9b0ca0cee6f7a94e5566735fe6cff1fcad3199602f88528d19aa8d0263adff8f5053c38254a2a3";
+
+// Safe primes for BC setup
+char *PT_hex = "CA5F37B7C0DDF6530B30A41116588218DE95F1F36B807FD7C28E4C467EE3F35967BC01D28B71F8A627A353675A81C86A1FF03DCECAF1686891183FA317BA34A4A1148D40A89F1F3AC0C200511C6CFE02342CD75354C25A2E069886DD4FB73BD365660D163F1282B143119AB8F375A73875EC16B634F52593B73BC6D875F2D3EF";
+char *QT_hex = "C2FC545C1C803F6C7625FBC4ECF9355734D6B6058FD714816D3ECFB93F1F705C9CE90D4F8796A05148AB5ABC201F90889231CC6BF5F68ED15EE4D901F603930A280EEABF10C613BFCB67A816363C839EB902B02607EB48AB8325E2B72620D4D294A232803217090DFB50AF8C620D4679E77CE3053437ED518F4F68840DCF1AA3";
+
+// Paillier ciphertext and plaintext
+char* M_hex = "0000000000000000000000000000000000000000000000000000000000000002";
+
+char* C_hex = "19c8b725dbd74b7dcaf72bd9ff2cd207b47cb1095393685906171af9e2f2959e7f68729e0e40f97a22bbca93373d618ad51dd077c0d102938598a8ecc8a656e978ebd14007da99db8e691d85fc18a428097ee8a63dcf95b84b660294474a20ed2edcf2b1b4f305c1cc25860a08d1348c2a4d24cc1a97b51f920e2985b8108b3392a5eafc443cf3449e288eb49dbde2228a56233afa5a6643e5ae6ec6aa8937a666ef74a30625c35bb22c3cc57b700f8eae7690f8d37edbfd27ccb2e882f70d0d85e0cc825347453a28e98e877ab1eeaa6efa09f034bc8976bffb86420106978066ff52221b315f71eb32cbf608d2b [...]
+
+char* R_hex = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...]
+
+int main()
+{
+    int rc;
+
+    PAILLIER_private_key priv_key;
+    PAILLIER_public_key  pub_key;
+
+    BIT_COMMITMENT_priv priv_mod;
+    BIT_COMMITMENT_pub  pub_mod;
+
+    BIT_COMMITMENT_commitment co;
+    BIT_COMMITMENT_rv         rv;
+    BIT_COMMITMENT_proof      proof;
+
+    char c[2*FS_2048];
+    octet C = {0, sizeof(c), c};
+
+    char r[2*FS_2048];
+    octet R = {0, sizeof(r), r};
+
+    char m[MODBYTES_256_56];
+    octet M = {0, sizeof(m), m};
+
+    char e[MODBYTES_256_56];
+    octet E = {0, sizeof(e), e};
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+
+    ECP_SECP256K1 G;
+    ECP_SECP256K1 U;
+    ECP_SECP256K1 X;
+
+    BIG_256_56 m_big;
+
+    // Deterministic RNG for testing
+    char seed[32] = {0};
+    csprng RNG;
+    RAND_seed(&RNG, 32, seed);
+
+    // Load paillier key
+    OCT_fromHex(&P, P_hex);
+    OCT_fromHex(&Q, Q_hex);
+
+    PAILLIER_KEY_PAIR(NULL, &P, &Q, &pub_key, &priv_key);
+
+    // Generate BC commitment modulus
+    OCT_fromHex(&P, PT_hex);
+    OCT_fromHex(&Q, QT_hex);
+    BIT_COMMITMENT_setup(&RNG, &priv_mod, &P, &Q, NULL, NULL);
+
+    BIT_COMMITMENT_priv_to_pub(&pub_mod, &priv_mod);
+
+    // Load Paillier encryption values
+    OCT_fromHex(&M, M_hex);
+    OCT_fromHex(&R, R_hex);
+    OCT_fromHex(&C, C_hex);
+
+    // Load curve generator for DLOG and compute DLOG
+    ECP_SECP256K1_generator(&G);
+    ECP_SECP256K1_generator(&U);
+    ECP_SECP256K1_generator(&X);
+    BIG_256_56_fromBytesLen(m_big, M.val, M.len);
+    ECP_SECP256K1_mul(&X, m_big);
+
+    // Random challenge for testing
+    OCT_rand(&E, &RNG, E.max);
+
+    // Run smoke test for Bit Commitment
+    BIT_COMMITMENT_commit(&RNG, &priv_key, &pub_mod, &M, &rv, &co);
+    BIT_COMMITMENT_prove(&priv_key, &M, &R, &rv, &E, &proof);
+    rc = BIT_COMMITMENT_verify(&pub_key, &priv_mod, &C, &co, &E, &proof);
+
+    if (rc != BIT_COMMITMENT_OK)
+    {
+        printf("FAILURE BIT_COMMITMENT_verify smoke test. error code %d\n", rc);
+        exit(EXIT_FAILURE);
+    }
+
+    // Run smoke test for additional DLOG ZKP
+    BIT_COMMITMENT_ECP_commit(&U, rv.alpha);
+    rc = BIT_COMMITMENT_ECP_verify(&G, &X, &U, &E, proof.s1);
+    if (rc != BIT_COMMITMENT_OK)
+    {
+        printf("FAILURE BIT_COMMITMENT_ECP_verify smoke test. error code %d\n", rc);
+        exit(EXIT_FAILURE);
+    }
+
+    // Clean random values
+    BIT_COMMITMENT_rv_kill(&rv);
+
+    ff_2048_cleaned(rv.alpha, "rv.alpha", FFLEN_2048);
+    ff_2048_cleaned(rv.beta,  "rv.beta",  FFLEN_2048);
+    ff_2048_cleaned(rv.gamma, "rv.gamma", FFLEN_2048 + HFLEN_2048);
+    ff_2048_cleaned(rv.rho,   "rv.rho",   FFLEN_2048 + HFLEN_2048);
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
\ No newline at end of file
diff --git a/test/smoke/test_hidden_dlog_smoke.c b/test/smoke/test_hidden_dlog_smoke.c
new file mode 100644
index 0000000..f83b45f
--- /dev/null
+++ b/test/smoke/test_hidden_dlog_smoke.c
@@ -0,0 +1,139 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* ZKPoK of DLOG over a hidden order group smoke test */
+
+#include "amcl/hidden_dlog.h"
+
+// Safe primes P = 2p+1, Q = 2q+1
+char *Phex  = "e41615620cb68a9ea8df28551b27f333cf65c770c7e959435786d4b510fe360a304fd2bf437431e790dc4c54da6db03119e75ef0b3f47436acf78a9e7b2276ebdd864e49d3bf450c496b10471f024dc4ae1f659c41aacdfb8ee6d52ba46a82d41f79a14277a61474a6473b7e4ab82528383d6400dc71278941e16c138d74d5bb";
+char *Qhex  = "d344c02d8379387e773ab6fa6de6b92b395d5b7f0c41660778766a1ec4740468203bff2d05f263ff6f22740d4b2e799fd1fd2e2339e328c62d31eeecba30fd4892e0c1637e0f62b4de34f5d778a7dfd181b94464f3669751264a0058708a360552535653efc75e3035485e966df30a17146d692747e20b2f04f3877dd1f56dcf";
+
+// B1 = B0 ^ A mod PQ with B0 generator of G_pq
+char *Ahex  = "2545cf613d4a6fa16bec6ec4dfc0c512bb6b8ea31250414f01f466776d30ca080e323392759180cf0e853a9168b59cf32589f84c1380c3a1482c031cb3b32b5e2dc062dde861fe09dd57afb1c2b8674a35dfe016368e2345592fd90e76060532ce61cbec50a49c67c5ab3f3b433aaa8d0480f79123b14a375f6a8f8ebc91cabd8e5fe5428a37f11caee1f7833418d60c2a757304ca1f12e2a63a366e7ec3007a4c62b068b6207aa2ce2ea287fbdeff973f4a725da10df44134a8f981f22157ee932a3b3565ec723af666553c668fcd31cf342712b4dff9bb5e95dc0d6cc23cfb31b9fdd92f00a35a200c2656054bb [...]
+char *B0hex = "5e712c49e4648060d2a1f4487aa56496f75106571e4f6fedebf0150fa628d968e8694919d151e21a521c3e80309e5830b4c284f0e00e084fbac1defffbbf2f4f467b2ba14b7ca796fab4574310bf5afead953bfaf01750f0dd8f771df7bc6cfa64b9a108648d8a180a361f5faa9549a56afae8b2bd0563b5591a20439e0781babb280ab30f2b5b6abe4e35b600403f9e86564197fd7a5da724f3fb265600c619645b50cad7ed2597c189b082a18f641dbbf79c28a75add4915ce0ff19ef229a4d03e11cdc1b37d42df20c25b6cd991ab8b31d82051bcb7c3848ca1eac18cb9bab5eaf36390f90bf7e34aace31279c [...]
+char *B1hex = "199540bcefff1aa1af7d665e5fb401a57a0962004fd0f6c4e7ec1543daf9a57c4e758b7e3bb8e9bb9528699cddd5ae23522decee78a67da3a872e1b2fcbc3be354674fd4c037639da2ace925805471bf960d6679bfdac6b722bd1f607f314e05c2c2b7f5af9d85c49c82a40a91b217806f8e18fc1b3746f380b0512458fc7f81e58a052afadcd9fe448e61ce846ab729344b9c845dd4590888ee25abc695ef04efdd9f02a35e89bb563a68cb54ed8a7fba6de284385b8e065372082b10b00499f62dd522ad51d0a4f44f509876b6b3a9e824e172550ef09f5d07183b6ab87671fda390a5a080f50e88d987c5d0ea6 [...]
+
+int main()
+{
+    int i, rc;
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+
+    char w[FS_2048];
+    octet W = {0, sizeof(w), w};
+
+    MODULUS_priv m;
+
+    BIG_1024_58 ord[FFLEN_2048];
+
+    BIG_1024_58 alpha[FFLEN_2048];
+    BIG_1024_58 b0[FFLEN_2048];
+    BIG_1024_58 b1[FFLEN_2048];
+
+    BIG_1024_58 ws1[HFLEN_2048];
+    BIG_1024_58 ws2[HFLEN_2048];
+
+    HDLOG_iter_values r;
+    HDLOG_iter_values rho;
+    HDLOG_iter_values t;
+
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+
+    // Deterministic RNG for testing
+    char seed[32] = {0};
+    csprng RNG;
+    RAND_seed(&RNG, 32, seed);
+
+    // Pseudorandom ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
+    // Load values
+    OCT_fromHex(&P, Phex);
+    OCT_fromHex(&Q, Qhex);
+
+    MODULUS_fromOctets(&m, &P, &Q);
+
+    OCT_fromHex(&W, Ahex);
+    FF_2048_fromOctet(alpha, &W, FFLEN_2048);
+
+    OCT_fromHex(&W, B0hex);
+    FF_2048_fromOctet(b0, &W, FFLEN_2048);
+
+    OCT_fromHex(&W, B1hex);
+    FF_2048_fromOctet(b1, &W, FFLEN_2048);
+
+    // Compute order of B0
+    FF_2048_copy(ws1, m.p, HFLEN_2048);
+    FF_2048_copy(ws2, m.q, HFLEN_2048);
+
+    FF_2048_shr(ws1, HFLEN_2048);
+    FF_2048_shr(ws2, HFLEN_2048);
+
+    FF_2048_mul(ord, ws1, ws2, HFLEN_2048);
+
+    // Smoke test
+    HDLOG_commit(&RNG, &m, ord, b0, r, rho);
+
+    HDLOG_challenge(m.n, b0, b1, rho, &ID, &AD, &E);
+
+    HDLOG_prove(ord, alpha, r, &E, t);
+
+    rc = HDLOG_verify(m.n, b0, b1, rho, &E, t);
+    if (rc != HDLOG_OK)
+    {
+        fprintf(stderr, "FAILURE HDLOG_verify failed");
+        exit(EXIT_FAILURE);
+    }
+
+    HDLOG_iter_values_kill(r);
+
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        if (!FF_2048_iszilch(r[i], FFLEN_2048))
+        {
+            printf("FAILURE HDLOG_iter_values_kill at %d\n", i);
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    MODULUS_kill(&m);
+    FF_2048_zero(ws1, FFLEN_2048);
+    FF_2048_zero(ws2, FFLEN_2048);
+    FF_2048_zero(ord, FFLEN_2048);
+    FF_2048_zero(alpha, FFLEN_2048);
+
+    OCT_clear(&P);
+    OCT_clear(&Q);
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/smoke/test_nm_commit_smoke.c b/test/smoke/test_nm_commit_smoke.c
index 548092f..f2ee519 100644
--- a/test/smoke/test_nm_commit_smoke.c
+++ b/test/smoke/test_nm_commit_smoke.c
@@ -20,7 +20,7 @@ under the License.
 /* NM commitment smoke test */
 
 #include <stdio.h>
-#include "amcl/commitments.h"
+#include "amcl/nm_commitment.h"
 
 int main()
 {
@@ -42,12 +42,12 @@ int main()
 
     OCT_rand(&X, &RNG, X.max);
 
-    COMMITMENTS_NM_commit(&RNG, &X, &R, &C);
+    NM_COMMITMENT_commit(&RNG, &X, &R, &C);
 
-    rc = COMMITMENTS_NM_decommit(&X, &R, &C);
-    if (rc != COMMITMENTS_OK)
+    rc = NM_COMMITMENT_decommit(&X, &R, &C);
+    if (rc != NM_COMMITMENT_OK)
     {
-        fprintf(stderr, "FAILURE COMMITMENTS_NM_decommit.\n");
+        fprintf(stderr, "FAILURE NM_COMMITMENT_decommit.\n");
         exit(EXIT_FAILURE);
     }
 
diff --git a/test/test.c b/test/test.c
index 7cd65fc..0e84760 100644
--- a/test/test.c
+++ b/test/test.c
@@ -82,6 +82,22 @@ void read_ECP_SECP256K1(FILE *fp, ECP_SECP256K1 *P, char *string)
     }
 }
 
+void read_HDLOG_iv(FILE *fp, HDLOG_iter_values V, char *string)
+{
+    char oct[HDLOG_VALUES_SIZE];
+    octet OCT = {0, sizeof(oct), oct};
+
+    read_OCTET(fp, &OCT, string);
+
+    if (HDLOG_iter_values_fromOctet(V, &OCT) != HDLOG_OK)
+    {
+        fclose(fp);
+
+        printf("ERROR invalid test vector HDLOG %s\n", string);
+        exit(EXIT_FAILURE);
+    }
+}
+
 void scan_int(int *v, char *line, const char *prefix)
 {
     if (!strncmp(line, prefix, strlen(prefix)))
@@ -150,6 +166,24 @@ void scan_ECP_SECP256K1(FILE *fp, ECP_SECP256K1 *P, char *line, const char *pref
     }
 }
 
+void scan_HDLOG_iv(FILE *fp, HDLOG_iter_values V, char *line, const char *prefix)
+{
+    if (!strncmp(line, prefix, strlen(prefix)))
+    {
+        line+=strlen(prefix);
+        read_HDLOG_iv(fp, V, line);
+
+#ifdef DEBUG
+        char oct[HDLOG_VALUES_SIZE];
+        octet OCT = {0, sizeof(oct), oct};
+        HDLOG_iter_values_toOctet(&OCT, V);
+
+        printf("%s", prefix);
+        OCT_output(&OCT);
+#endif
+    }
+}
+
 /* Assertion utilities */
 
 void compare_OCT(FILE* fp, int testNo, char *name, octet *X, octet *Y)
@@ -249,6 +283,34 @@ void compare_ECP_SECP256K1(FILE *fp, int testNo, char *name, ECP_SECP256K1 *P, E
     }
 }
 
+void compare_HDLOG_iv(FILE *fp, int testNo, char* name, HDLOG_iter_values V, HDLOG_iter_values R)
+{
+    int i;
+
+    for (i = 0; i < HDLOG_PROOF_ITERS; i++)
+    {
+        if (FF_2048_comp(V[i], R[i], FFLEN_2048))
+        {
+            if (fp != NULL)
+            {
+                fclose(fp);
+            }
+
+            fprintf(stderr, "FAILURE %s. Test %d\n", name, testNo);
+
+#ifdef DEBUG
+            printf("V[%d] = ", i);
+            FF_2048_output(V[i],FFLEN_2048);
+            printf("\nR[%d] = ", i);
+            FF_2048_output(R[i],FFLEN_2048);
+            printf("\n");
+#endif
+
+            exit(EXIT_FAILURE);
+        }
+    }
+}
+
 void assert(FILE *fp, char *msg, int statement)
 {
     if (!statement)
diff --git a/test/test.h b/test/test.h
index ed16dc1..98bbe13 100644
--- a/test/test.h
+++ b/test/test.h
@@ -25,9 +25,11 @@ under the License.
 #define TEST_H
 
 #include "amcl/amcl.h"
+#include "amcl/big_256_56.h"
 #include "amcl/ff_2048.h"
 #include "amcl/ff_4096.h"
 #include "amcl/ecp_SECP256K1.h"
+#include "amcl/hidden_dlog.h"
 
 #ifdef __cplusplus
 extern "C"
@@ -68,6 +70,14 @@ extern void read_FF_4096(FILE *fp, BIG_512_60 *x, char *string, int n);
  */
 extern void read_ECP_SECP256K1(FILE *fp, ECP_SECP256K1 *P, char *string);
 
+/*! \brief Read string into an HDLOG_iter_values
+ *
+ *  @param  fp      TV file pointer to close in case of error
+ *  @param  V       Output values
+ *  @param  string  Input string
+ */
+extern void read_HDLOG_iv(FILE *fp, HDLOG_iter_values V, char *string);
+
 /*! \brief Read integer if the line has the correct prefix
  *
  *  @param  v       Output integer
@@ -114,6 +124,15 @@ extern void scan_FF_4096(FILE *fp, BIG_512_60 *x, char *line, const char *prefix
  */
 extern void scan_ECP_SECP256K1(FILE *fp, ECP_SECP256K1 *P, char *line, const char *prefix);
 
+/*! \brief Read string into an HDLOG_iter_values
+ *
+ *  @param  fp      TV file pointer to close in case of error
+ *  @param  V       Output values
+ *  @param  line    TV line
+ *  @param  prefix  Line prefix for the element to read
+ */
+extern void scan_HDLOG_iv(FILE *fp, HDLOG_iter_values V, char *line, const char *prefix);
+
 /* Assertion utilities */
 
 /*! \brief Compare two octets
@@ -166,6 +185,16 @@ extern void compare_FF_4096(FILE *fp, int testNo, char* name, BIG_512_60 *x, BIG
  */
 extern void compare_ECP_SECP256K1(FILE *fp, int testNo, char* name, ECP_SECP256K1 *P, ECP_SECP256K1 *Q);
 
+/*! \brief Compare two HDLOG_iter_values
+ *
+ *  @param  fp      TV file pointer to close in case of error
+ *  @param  testNo  Test Vector identifier
+ *  @param  name    Descriptor for the elements compared
+ *  @param  V       First element to compare
+ *  @param  R       Second element to compare
+ */
+extern void compare_HDLOG_iv(FILE *fp, int testNo, char* name, HDLOG_iter_values V, HDLOG_iter_values R);
+
 /*! \brief Assert boolean statement
  *
  *  Assert boolean statement and fail the test if does not hold
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index 4fa3bea..0dda107 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -48,7 +48,7 @@ amcl_test(test_phase5_prove  test_phase5_prove.c  amcl_mpc "SUCCESS" "mpc/phase5
 amcl_test(test_phase5_verify test_phase5_verify.c amcl_mpc "SUCCESS" "mpc/phase5_verify.txt")
 
 # NM Commitment tests
-amcl_test(test_nm_commit test_nm_commit.c amcl_mpc "SUCCESS" "commitments/nm_commit.txt")
+amcl_test(test_nm_commit test_nm_commit.c amcl_mpc "SUCCESS" "nm_commitment/commit.txt")
 
 # ZKP of knowledge of factoring
 amcl_test(test_factoring_zk_prove  test_factoring_zk_prove.c  amcl_mpc "SUCCESS" "factoring_zk/prove.txt")
@@ -67,9 +67,6 @@ amcl_test(test_d_schnorr_prove     test_d_schnorr_prove.c     amcl_mpc "SUCCESS"
 amcl_test(test_d_schnorr_verify    test_d_schnorr_verify.c    amcl_mpc "SUCCESS" "schnorr/dverify.txt")
 
 # BC Commitment tests
-amcl_test(test_bc_setup     test_bc_setup.c     amcl_mpc "SUCCESS" "commitments/bc_setup.txt")
-amcl_test(test_bc_internals test_bc_internals.c amcl_mpc "SUCCESS")
-
 # MTA Range Proof tests
 amcl_test(test_mta_rp_commit    test_mta_rp_commit.c    amcl_mpc "SUCCESS" "mta/rp_commit.txt")
 amcl_test(test_mta_rp_challenge test_mta_rp_challenge.c amcl_mpc "SUCCESS" "mta/rp_challenge.txt")
@@ -90,3 +87,25 @@ amcl_test(test_mta_zkwc_challenge test_mta_zkwc_challenge.c amcl_mpc "SUCCESS" "
 amcl_test(test_mta_zkwc_prove     test_mta_zkwc_prove.c     amcl_mpc "SUCCESS" "mta/mtawc_prove.txt")
 amcl_test(test_mta_zkwc_verify    test_mta_zkwc_verify.c    amcl_mpc "SUCCESS" "mta/mtawc_verify.txt")
 amcl_test(test_mta_zkwc_octets    test_mta_zkwc_octets.c    amcl_mpc "SUCCESS" "mta/mtawc_verify.txt")
+amcl_test(test_bit_commitment_setup           test_bit_commitment_setup.c           amcl_mpc "SUCCESS" "bit_commitment/setup.txt")
+amcl_test(test_bit_commitment_setup_internals test_bit_commitment_setup_internals.c amcl_mpc "SUCCESS")
+
+amcl_test(test_bit_commitment_ecp_commit test_bit_commitment_ecp_commit.c amcl_mpc "SUCCESS" "bit_commitment/ecp_commit.txt")
+amcl_test(test_bit_commitment_ecp_verify test_bit_commitment_ecp_verify.c amcl_mpc "SUCCESS" "bit_commitment/ecp_verify.txt")
+
+amcl_test(test_bit_commitment_commit test_bit_commitment_commit.c amcl_mpc "SUCCESS" "bit_commitment/plain_commit.txt")
+amcl_test(test_bit_commitment_prove  test_bit_commitment_prove.c  amcl_mpc "SUCCESS" "bit_commitment/plain_prove.txt")
+amcl_test(test_bit_commitment_verify test_bit_commitment_verify.c amcl_mpc "SUCCESS" "bit_commitment/plain_verify.txt")
+amcl_test(test_bit_commitment_octets test_bit_commitment_octets.c amcl_mpc "SUCCESS" "bit_commitment/plain_octets.txt")
+
+amcl_test(test_bit_commitment_muladd_commit test_bit_commitment_muladd_commit.c amcl_mpc "SUCCESS" "bit_commitment/muladd_commit.txt")
+amcl_test(test_bit_commitment_muladd_prove  test_bit_commitment_muladd_prove.c  amcl_mpc "SUCCESS" "bit_commitment/muladd_prove.txt")
+amcl_test(test_bit_commitment_muladd_verify test_bit_commitment_muladd_verify.c amcl_mpc "SUCCESS" "bit_commitment/muladd_verify.txt")
+amcl_test(test_bit_commitment_muladd_octets test_bit_commitment_muladd_octets.c amcl_mpc "SUCCESS" "bit_commitment/muladd_octets.txt")
+
+# Hidden DLOG tests
+amcl_test(test_hidden_dlog_commit    test_hidden_dlog_commit.c    amcl_mpc "SUCCESS" "hidden_dlog/commit.txt")
+amcl_test(test_hidden_dlog_challenge test_hidden_dlog_challenge.c amcl_mpc "SUCCESS" "hidden_dlog/challenge.txt")
+amcl_test(test_hidden_dlog_prove     test_hidden_dlog_prove.c     amcl_mpc "SUCCESS" "hidden_dlog/prove.txt")
+amcl_test(test_hidden_dlog_verify    test_hidden_dlog_verify.c    amcl_mpc "SUCCESS" "hidden_dlog/verify.txt")
+
diff --git a/test/unit/test_bit_commitment_commit.c b/test/unit/test_bit_commitment_commit.c
new file mode 100644
index 0000000..b6ea771
--- /dev/null
+++ b/test/unit/test_bit_commitment_commit.c
@@ -0,0 +1,135 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier Plaintext Proof commitment unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_commitment c;
+    BIT_COMMITMENT_commitment c_golden;
+    const char *Zline = "Z = ";
+    const char *Uline = "U = ";
+    const char *Wline = "W = ";
+
+    BIT_COMMITMENT_rv r;
+    const char *ALPHAline = "ALPHA = ";
+    const char *BETAline  = "BETA = ";
+    const char *GAMMAline = "GAMMA = ";
+    const char *RHOline   = "RHO = ";
+
+    BIT_COMMITMENT_pub m;
+    const char *NTline = "NT = ";
+    const char *H1line = "H1 = ";
+    const char *H2line = "H2 = ";
+
+    char x[EGS_SECP256K1];
+    octet X = {0, sizeof(x), x};
+    const char *Xline = "X = ";
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+    const char *Pline = "P = ";
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+    const char *Qline = "Q = ";
+
+    PAILLIER_private_key priv;
+    PAILLIER_public_key pub;
+
+    // Line terminating a test vector
+    const char *last_line = Wline;
+
+    /* Test happy path using test vectors */
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_OCTET(fp, &X, line, Xline);
+        scan_OCTET(fp, &P, line, Pline);
+        scan_OCTET(fp, &Q, line, Qline);
+
+        scan_FF_2048(fp, m.b0, line, H1line, FFLEN_2048);
+        scan_FF_2048(fp, m.b1, line, H2line, FFLEN_2048);
+        scan_FF_2048(fp, m.N,  line, NTline, FFLEN_2048);
+
+        scan_FF_2048(fp, r.alpha, line, ALPHAline, HFLEN_2048);
+        scan_FF_2048(fp, r.beta,  line, BETAline,  FFLEN_2048);
+        scan_FF_2048(fp, r.gamma, line, GAMMAline, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, r.rho,   line, RHOline,   FFLEN_2048 + HFLEN_2048);
+
+        // Read ground truth
+        scan_FF_2048(fp, c_golden.z, line, Zline, FFLEN_2048);
+        scan_FF_4096(fp, c_golden.u, line, Uline, FFLEN_4096);
+        scan_FF_2048(fp, c_golden.w, line, Wline, FFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            PAILLIER_KEY_PAIR(NULL, &P, &Q, &pub, &priv);
+
+            BIT_COMMITMENT_commit(NULL, &priv, &m, &X, &r, &c);
+
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_commit c.z", c.z, c_golden.z, FFLEN_2048);
+            compare_FF_4096(fp, testNo, "BIT_COMMITMENT_commit c.u", c.u, c_golden.u, FFLEN_4096);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_commit c.w", c.w, c_golden.w, FFLEN_2048);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_ecp_commit.c b/test/unit/test_bit_commitment_ecp_commit.c
new file mode 100644
index 0000000..253db9b
--- /dev/null
+++ b/test/unit/test_bit_commitment_ecp_commit.c
@@ -0,0 +1,92 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment DLOG commit unit test */
+
+#define LINE_LEN 512
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_ecp_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIG_1024_58 alpha[HFLEN_2048];
+    const char *ALPHAline = "ALPHA = ";
+
+    ECP_SECP256K1 R;
+    const char *Rline = "R = ";
+
+    ECP_SECP256K1 U;
+    const char *Uline = "U = ";
+
+    // Line terminating a test vector
+    const char *last_line = Uline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_FF_2048(fp, alpha, line, ALPHAline, HFLEN_2048);
+
+        scan_ECP_SECP256K1(fp, &R, line, Rline);
+        scan_ECP_SECP256K1(fp, &U, line, Uline);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            BIT_COMMITMENT_ECP_commit(&R, alpha);
+            compare_ECP_SECP256K1(fp, testNo, "BIT_COMMITMENT_ECP_commit", &R, &U);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_ecp_verify.c b/test/unit/test_bit_commitment_ecp_verify.c
new file mode 100644
index 0000000..59f36f5
--- /dev/null
+++ b/test/unit/test_bit_commitment_ecp_verify.c
@@ -0,0 +1,109 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment DLOG commit unit test */
+
+#define LINE_LEN 512
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_ecp_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int rc;
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    ECP_SECP256K1 R;
+    const char *Rline = "R = ";
+
+    ECP_SECP256K1 X;
+    const char *Xline = "X = ";
+
+    ECP_SECP256K1 U;
+    const char *Uline = "U = ";
+
+    char e[EGS_SECP256K1];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    BIG_1024_58 s1[HFLEN_2048];
+    const char *S1line = "S1 = ";
+
+    // Line terminating a test vector
+    const char *last_line = S1line;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test happy path using test vectors */
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_ECP_SECP256K1(fp, &R, line, Rline);
+        scan_ECP_SECP256K1(fp, &X, line, Xline);
+        scan_ECP_SECP256K1(fp, &U, line, Uline);
+
+        scan_OCTET(fp, &E, line, Eline);
+
+        scan_FF_2048(fp, s1, line, S1line, HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            rc = BIT_COMMITMENT_ECP_verify(&R, &X, &U, &E, s1);
+            assert_tv(fp, testNo, "BIT_COMMITMENT_ECP_verify", rc == BIT_COMMITMENT_OK);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test unhappy path */
+    rc = BIT_COMMITMENT_ECP_verify(&R, &X, &U, &E, s1);
+    assert(NULL, "BIT_COMMITMENT_ECP_verify. Invalid U\n", rc == BIT_COMMITMENT_FAIL);
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_muladd_commit.c b/test/unit/test_bit_commitment_muladd_commit.c
new file mode 100644
index 0000000..557a953
--- /dev/null
+++ b/test/unit/test_bit_commitment_muladd_commit.c
@@ -0,0 +1,151 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier muladd Proof commit unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_muladd_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_muladd_commitment c;
+    BIT_COMMITMENT_muladd_commitment c_golden;
+    const char *Zline  = "Z = ";
+    const char *Z1line = "Z1 = ";
+    const char *Tline  = "T = ";
+    const char *Vline  = "V = ";
+    const char *Wline  = "W = ";
+
+    BIT_COMMITMENT_muladd_rv r;
+    const char *ALPHAline = "ALPHA = ";
+    const char *BETAline  = "BETA = ";
+    const char *GAMMAline = "GAMMA = ";
+    const char *RHOline   = "RHO = ";
+    const char *RHO1line  = "RHO1 = ";
+    const char *SIGMAline = "SIGMA = ";
+    const char *TAUline   = "TAU = ";
+
+    BIT_COMMITMENT_pub m;
+    const char *NTline = "NT = ";
+    const char *H1line = "H1 = ";
+    const char *H2line = "H2 = ";
+
+    char x[MODBYTES_256_56];
+    octet X = {0, sizeof(x), x};
+    const char *Xline = "X = ";
+
+    char y[MODBYTES_256_56];
+    octet Y = {0, sizeof(y), y};
+    const char *Yline = "Y = ";
+
+    char c1[2 * FS_2048];
+    octet C1 = {0, sizeof(c1), c1};
+    const char *C1line = "C1 = ";
+
+    char n[FS_2048];
+    octet N = {0, sizeof(n), n};
+    const char *Nline = "N = ";
+
+    PAILLIER_public_key key;
+
+    // Line terminating a test vector
+    const char *last_line = Wline;
+
+    /* Test happy path using test vectors */
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_OCTET(fp, &X,  line, Xline);
+        scan_OCTET(fp, &Y,  line, Yline);
+        scan_OCTET(fp, &C1, line, C1line);
+        scan_OCTET(fp, &N,  line, Nline);
+
+        scan_FF_2048(fp, m.b0, line, H1line, FFLEN_2048);
+        scan_FF_2048(fp, m.b1, line, H2line, FFLEN_2048);
+        scan_FF_2048(fp, m.N,  line, NTline, FFLEN_2048);
+
+        scan_FF_2048(fp, r.alpha, line, ALPHAline, HFLEN_2048);
+        scan_FF_2048(fp, r.beta,  line, BETAline,  FFLEN_2048);
+        scan_FF_2048(fp, r.gamma, line, GAMMAline, FFLEN_2048);
+        scan_FF_2048(fp, r.rho,   line, RHOline,   FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, r.rho1,  line, RHO1line,  FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, r.sigma, line, SIGMAline, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, r.tau,   line, TAUline,   FFLEN_2048 + HFLEN_2048);
+
+        // Read ground truth
+        scan_FF_2048(fp, c_golden.z,  line, Zline,  FFLEN_2048);
+        scan_FF_2048(fp, c_golden.z1, line, Z1line, FFLEN_2048);
+        scan_FF_2048(fp, c_golden.t,  line, Tline,  FFLEN_2048);
+        scan_FF_2048(fp, c_golden.v,  line, Vline,  2 * FFLEN_2048);
+        scan_FF_2048(fp, c_golden.w,  line, Wline,  FFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            PAILLIER_PK_fromOctet(&key, &N);
+
+            BIT_COMMITMENT_muladd_commit(NULL, &key, &m, &X, &Y, &C1, &r, &c);
+
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_commit c.z",  c.z,  c_golden.z,  FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_commit c.z1", c.z1, c_golden.z1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_commit c.t",  c.t,  c_golden.t,  FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_commit c.v",  c.v,  c_golden.v,  2 * FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_commit c.w",  c.w,  c_golden.w,  FFLEN_2048);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_muladd_octets.c b/test/unit/test_bit_commitment_muladd_octets.c
new file mode 100644
index 0000000..fbef0b4
--- /dev/null
+++ b/test/unit/test_bit_commitment_muladd_octets.c
@@ -0,0 +1,140 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier muladd Proof octet functions unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_muladd_octets [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_muladd_commitment c;
+    BIT_COMMITMENT_muladd_commitment c_reloaded;
+    const char *Zline  = "Z = ";
+    const char *Z1line = "Z1 = ";
+    const char *Tline  = "T = ";
+    const char *Vline  = "V = ";
+    const char *Wline  = "W = ";
+
+    BIT_COMMITMENT_muladd_proof p;
+    BIT_COMMITMENT_muladd_proof p_reloaded;
+    const char *Sline  = "S = ";
+    const char *S1line = "S1 = ";
+    const char *S2line = "S2 = ";
+    const char *T1line = "T1 = ";
+    const char *T2line = "T2 = ";
+
+    char oct1[FS_2048];
+    octet OCT1 = {0, sizeof(oct1), oct1};
+
+    char oct2[2 * FS_2048];
+    octet OCT2 = {0, sizeof(oct2), oct2};
+
+    char oct3[2 * FS_2048];
+    octet OCT3 = {0, sizeof(oct3), oct3};
+
+    char oct4[2 * FS_2048];
+    octet OCT4 = {0, sizeof(oct4), oct4};
+
+    char oct5[2 * FS_2048];
+    octet OCT5 = {0, sizeof(oct5), oct5};
+
+    // Make sure proof is properly zeroed before starting test
+    FF_2048_zero(p.s1, FFLEN_2048);
+
+    // Line terminating a test vector
+    const char *last_line = Wline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_FF_2048(fp, c.z,  line, Zline,  FFLEN_2048);
+        scan_FF_2048(fp, c.z1, line, Z1line, FFLEN_2048);
+        scan_FF_2048(fp, c.t,  line, Tline,  FFLEN_2048);
+        scan_FF_2048(fp, c.v,  line, Vline,  2 * FFLEN_2048);
+        scan_FF_2048(fp, c.w,  line, Wline,  FFLEN_2048);
+
+        scan_FF_2048(fp, p.s,  line, Sline,  FFLEN_2048);
+        scan_FF_2048(fp, p.s1, line, S1line, HFLEN_2048);
+        scan_FF_2048(fp, p.s2, line, S2line, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, p.t1, line, T1line, FFLEN_2048);
+        scan_FF_2048(fp, p.t2, line, T2line, FFLEN_2048 + HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            // Dump and reload commitment
+            BIT_COMMITMENT_muladd_commitment_toOctets(&OCT1, &OCT2, &OCT3, &OCT4, &OCT5, &c);
+            BIT_COMMITMENT_muladd_commitment_fromOctets(&c_reloaded, &OCT1, &OCT2, &OCT3, &OCT4, &OCT5);
+
+            compare_FF_2048(fp, testNo, "c.z",  c.z,  c_reloaded.z,  FFLEN_2048);
+            compare_FF_2048(fp, testNo, "c.z1", c.z1, c_reloaded.z1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "c.t",  c.t,  c_reloaded.t,  FFLEN_2048);
+            compare_FF_2048(fp, testNo, "c.v",  c.v,  c_reloaded.v,  2 * FFLEN_2048);
+            compare_FF_2048(fp, testNo, "c.w",  c.w,  c_reloaded.w,  FFLEN_2048);
+
+            BIT_COMMITMENT_muladd_proof_toOctets(&OCT1, &OCT2, &OCT3, &OCT4, &OCT5, &p);
+            BIT_COMMITMENT_muladd_proof_fromOctets(&p_reloaded, &OCT1, &OCT2, &OCT3, &OCT4, &OCT5);
+
+            compare_FF_2048(fp, testNo, "p.s",  p.s,  p_reloaded.s,  FFLEN_2048);
+            compare_FF_2048(fp, testNo, "p.s1", p.s1, p_reloaded.s1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "p.s2", p.s2, p_reloaded.s2, FFLEN_2048 + HFLEN_2048);
+            compare_FF_2048(fp, testNo, "p.t1", p.t1, p_reloaded.t1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "p.t2", p.t2, p_reloaded.t2, FFLEN_2048 + HFLEN_2048);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_muladd_prove.c b/test/unit/test_bit_commitment_muladd_prove.c
new file mode 100644
index 0000000..105d2fa
--- /dev/null
+++ b/test/unit/test_bit_commitment_muladd_prove.c
@@ -0,0 +1,150 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier muladd Proof prove unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_muladd_prove [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_muladd_rv rv;
+    const char *ALPHAline = "ALPHA = ";
+    const char *BETAline  = "BETA = ";
+    const char *GAMMAline = "GAMMA = ";
+    const char *RHOline   = "RHO = ";
+    const char *RHO1line  = "RHO1 = ";
+    const char *SIGMAline = "SIGMA = ";
+    const char *TAUline   = "TAU = ";
+
+    char x[MODBYTES_256_56];
+    octet X = {0, sizeof(x), x};
+    const char *Xline = "X = ";
+
+    char y[MODBYTES_256_56];
+    octet Y = {0, sizeof(y), y};
+    const char *Yline = "Y = ";
+
+    char r[2*FS_2048];
+    octet R = {0, sizeof(r), r};
+    const char *Rline = "R = ";
+
+    char e[MODBYTES_256_56];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    char n[FS_2048];
+    octet N = {0, sizeof(n), n};
+    const char *Nline = "N = ";
+
+    PAILLIER_public_key key;
+
+    BIT_COMMITMENT_muladd_proof p;
+    BIT_COMMITMENT_muladd_proof p_golden;
+    const char *Sline  = "S = ";
+    const char *S1line = "S1 = ";
+    const char *S2line = "S2 = ";
+    const char *T1line = "T1 = ";
+    const char *T2line = "T2 = ";
+
+    // Make sure proof is properly zeroed before starting test
+    FF_2048_zero(p_golden.s1, FFLEN_2048);
+
+    // Line terminating a test vector
+    const char *last_line = T2line;
+
+    /* Test happy path using test vectors */
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_OCTET(fp, &E, line, Eline);
+        scan_OCTET(fp, &R, line, Rline);
+        scan_OCTET(fp, &X,  line, Xline);
+        scan_OCTET(fp, &Y,  line, Yline);
+        scan_OCTET(fp, &N,  line, Nline);
+
+        scan_FF_2048(fp, rv.alpha, line, ALPHAline, HFLEN_2048);
+        scan_FF_2048(fp, rv.beta,  line, BETAline,  FFLEN_2048);
+        scan_FF_2048(fp, rv.gamma, line, GAMMAline, FFLEN_2048);
+        scan_FF_2048(fp, rv.rho,   line, RHOline,   FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, rv.rho1,  line, RHO1line,  FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, rv.sigma, line, SIGMAline, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, rv.tau,   line, TAUline,   FFLEN_2048 + HFLEN_2048);
+
+        // Read ground truth
+        scan_FF_2048(fp, p_golden.s,  line, Sline,  FFLEN_2048);
+        scan_FF_2048(fp, p_golden.s1, line, S1line, HFLEN_2048);
+        scan_FF_2048(fp, p_golden.s2, line, S2line, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, p_golden.t1, line, T1line, FFLEN_2048);
+        scan_FF_2048(fp, p_golden.t2, line, T2line, FFLEN_2048 + HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            PAILLIER_PK_fromOctet(&key, &N);
+
+            BIT_COMMITMENT_muladd_prove(&key, &X, &Y, &R, &rv, &E, &p);
+
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_proof p.s",  p.s,  p_golden.s,  FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_proof p.s1", p.s1, p_golden.s1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_proof p.s2", p.s2, p_golden.s2, FFLEN_2048 + HFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_proof p.t1", p.t1, p_golden.t1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_muladd_proof p.t2", p.t2, p_golden.t2, FFLEN_2048 + HFLEN_2048);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_muladd_verify.c b/test/unit/test_bit_commitment_muladd_verify.c
new file mode 100644
index 0000000..f674e40
--- /dev/null
+++ b/test/unit/test_bit_commitment_muladd_verify.c
@@ -0,0 +1,203 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier muladd Proof verify unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_muladd_verify [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int rc;
+    int test_run = 0;
+
+    char err_msg[128];
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_muladd_commitment c;
+    const char *Zline  = "Z = ";
+    const char *Z1line = "Z1 = ";
+    const char *Tline  = "T = ";
+    const char *Vline  = "V = ";
+    const char *Wline  = "W = ";
+
+    BIT_COMMITMENT_priv m;
+    const char *PTline = "PT = ";
+    const char *QTline = "QT = ";
+    const char *H1line = "H1 = ";
+    const char *H2line = "H2 = ";
+
+    BIT_COMMITMENT_muladd_proof proof;
+    const char *Sline  = "S = ";
+    const char *S1line = "S1 = ";
+    const char *S2line = "S2 = ";
+    const char *T1line = "T1 = ";
+    const char *T2line = "T2 = ";
+
+    char c1[2*FS_2048];
+    octet C1 = {0, sizeof(c1), c1};
+    const char *C1line = "C1 = ";
+
+    char c2[2*FS_2048];
+    octet C2 = {0, sizeof(c2), c2};
+    const char *C2line = "C2 = ";
+
+    char e[MODBYTES_256_56];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+    const char *Pline = "P = ";
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+    const char *Qline = "Q = ";
+
+    PAILLIER_private_key priv;
+    PAILLIER_public_key pub;
+
+    // Make sure proof is properly zeroed before starting test
+    FF_2048_zero(proof.s1, FFLEN_2048);
+
+    // Line terminating a test vector
+    const char *last_line = QTline;
+
+    /* Test happy path using test vectors */
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_OCTET(fp, &C1, line, C1line);
+        scan_OCTET(fp, &C2, line, C2line);
+        scan_OCTET(fp, &E, line, Eline);
+        scan_OCTET(fp, &P, line, Pline);
+        scan_OCTET(fp, &Q, line, Qline);
+
+        scan_FF_2048(fp, m.b0,    line, H1line, FFLEN_2048);
+        scan_FF_2048(fp, m.b1,    line, H2line, FFLEN_2048);
+        scan_FF_2048(fp, m.mod.p, line, PTline, HFLEN_2048);
+        scan_FF_2048(fp, m.mod.q, line, QTline, HFLEN_2048);
+
+        scan_FF_2048(fp, c.z,  line, Zline,  FFLEN_2048);
+        scan_FF_2048(fp, c.z1, line, Z1line, FFLEN_2048);
+        scan_FF_2048(fp, c.t,  line, Tline,  FFLEN_2048);
+        scan_FF_2048(fp, c.v,  line, Vline,  2 * FFLEN_2048);
+        scan_FF_2048(fp, c.w,  line, Wline,  FFLEN_2048);
+
+        scan_FF_2048(fp, proof.s,  line, Sline,  FFLEN_2048);
+        scan_FF_2048(fp, proof.s1, line, S1line, HFLEN_2048);
+        scan_FF_2048(fp, proof.s2, line, S2line, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, proof.t1, line, T1line, FFLEN_2048);
+        scan_FF_2048(fp, proof.t2, line, T2line, FFLEN_2048 + HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            PAILLIER_KEY_PAIR(NULL, &P, &Q, &pub, &priv);
+
+            rc = BIT_COMMITMENT_muladd_verify(&priv, &m, &C1, &C2, &c, &E, &proof);
+
+            sprintf(err_msg, "BIT_COMMITMENT_muladd_verify OK. rc %d", rc);
+            assert_tv(fp, testNo, err_msg, rc == BIT_COMMITMENT_OK);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test unhappy paths */
+
+    BIT_COMMITMENT_muladd_proof tmp;
+
+    FF_2048_copy(tmp.s,  proof.s,  FFLEN_2048);
+    FF_2048_copy(tmp.s1, proof.s1, FFLEN_2048);
+    FF_2048_copy(tmp.s2, proof.s2, FFLEN_2048 + HFLEN_2048);
+    FF_2048_copy(tmp.t1, proof.t1, FFLEN_2048);
+    FF_2048_copy(tmp.t2, proof.t2, FFLEN_2048 + HFLEN_2048);
+
+    rc = BIT_COMMITMENT_muladd_verify(&priv, &m, &C1, &C2, &c, &E, &tmp);
+    assert(NULL, "ERROR copying proof for unhappy path test\n", rc == BIT_COMMITMENT_OK);
+
+    // Test s1 > q^3
+    FF_2048_copy(tmp.s1, tmp.s2, FFLEN_2048);
+
+    rc = BIT_COMMITMENT_muladd_verify(&priv, &m, &C1, &C2, &c, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_muladd_verify s1 too long. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    FF_2048_copy(tmp.s1, proof.s1, FFLEN_2048);
+
+    // Test wrong z1 proof
+    FF_2048_dec(tmp.s1, 1, FFLEN_2048);
+
+    rc = BIT_COMMITMENT_muladd_verify(&priv, &m, &C1, &C2, &c, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_muladd_verify wrong z1 proof. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    FF_2048_copy(tmp.s1, proof.s1, FFLEN_2048);
+
+    // Test wrong w proof
+    FF_2048_dec(tmp.t1, 1, FFLEN_2048);
+
+    rc = BIT_COMMITMENT_muladd_verify(&priv, &m, &C1, &C2, &c, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_muladd_verify wrong w proof. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    FF_2048_copy(tmp.t1, proof.t1, FFLEN_2048);
+
+    // Test wrong v proof
+    FF_2048_dec(tmp.s, 1, FFLEN_2048);
+
+    rc = BIT_COMMITMENT_muladd_verify(&priv, &m, &C1, &C2, &c, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_muladd_verify wrong v proof. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_octets.c b/test/unit/test_bit_commitment_octets.c
new file mode 100644
index 0000000..664381d
--- /dev/null
+++ b/test/unit/test_bit_commitment_octets.c
@@ -0,0 +1,124 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier Plaintext Proof octet functions unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitments_octets [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_commitment c;
+    BIT_COMMITMENT_commitment c_reloaded;
+    const char *Zline = "Z = ";
+    const char *Uline = "U = ";
+    const char *Wline = "W = ";
+
+    BIT_COMMITMENT_proof p;
+    BIT_COMMITMENT_proof p_reloaded;
+    const char *Sline =  "S = ";
+    const char *S1line = "S1 = ";
+    const char *S2line = "S2 = ";
+
+    char oct1[FS_2048];
+    octet OCT1 = {0, sizeof(oct1), oct1};
+
+    char oct2[2 * FS_2048];
+    octet OCT2 = {0, sizeof(oct2), oct2};
+
+    char oct3[2 * FS_2048];
+    octet OCT3 = {0, sizeof(oct3), oct3};
+
+    // Make sure proof is properly zeroed before starting test
+    FF_4096_zero(p.s,  FFLEN_4096);
+    FF_2048_zero(p.s1, FFLEN_2048);
+
+    // Line terminating a test vector
+    const char *last_line = Wline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_FF_2048(fp, c.z, line, Zline, FFLEN_2048);
+        scan_FF_4096(fp, c.u, line, Uline, FFLEN_4096);
+        scan_FF_2048(fp, c.w, line, Wline, FFLEN_2048);
+
+        scan_FF_4096(fp, p.s,  line, Sline,  HFLEN_4096);
+        scan_FF_2048(fp, p.s1, line, S1line, HFLEN_2048);
+        scan_FF_2048(fp, p.s2, line, S2line, FFLEN_2048 + HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            // Dump and reload commitment
+            BIT_COMMITMENT_commitment_toOctets(&OCT1, &OCT2, &OCT3, &c);
+            BIT_COMMITMENT_commitment_fromOctets(&c_reloaded, &OCT1, &OCT2, &OCT3);
+
+            compare_FF_2048(fp, testNo, "c.z", c.z, c_reloaded.z, FFLEN_2048);
+            compare_FF_4096(fp, testNo, "c.u", c.u, c_reloaded.u, FFLEN_4096);
+            compare_FF_2048(fp, testNo, "c.w", c.w, c_reloaded.w, FFLEN_2048);
+
+            BIT_COMMITMENT_proof_toOctets(&OCT1, &OCT2, &OCT3, &p);
+            BIT_COMMITMENT_proof_fromOctets(&p_reloaded, &OCT1, &OCT2, &OCT3);
+
+            compare_FF_4096(fp, testNo, "p.s",  p.s,  p_reloaded.s,  FFLEN_4096);
+            compare_FF_2048(fp, testNo, "p.s1", p.s1, p_reloaded.s1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "p.s2", p.s2, p_reloaded.s2, FFLEN_2048 + HFLEN_2048);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitment_prove.c b/test/unit/test_bit_commitment_prove.c
new file mode 100644
index 0000000..bf29e20
--- /dev/null
+++ b/test/unit/test_bit_commitment_prove.c
@@ -0,0 +1,140 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier Plaintext Proof prove unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_bit_commitment_prove [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_rv rv;
+    const char *ALPHAline = "ALPHA = ";
+    const char *BETAline  = "BETA = ";
+    const char *GAMMAline = "GAMMA = ";
+    const char *RHOline   = "RHO = ";
+
+    char x[MODBYTES_256_56];
+    octet X = {0, sizeof(x), x};
+    const char *Xline = "X = ";
+
+    char r[2*FS_2048];
+    octet R = {0, sizeof(r), r};
+    const char *Rline = "R = ";
+
+    char e[EGS_SECP256K1];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+    const char *Pline = "P = ";
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+    const char *Qline = "Q = ";
+
+    PAILLIER_private_key priv;
+    PAILLIER_public_key pub;
+
+    BIT_COMMITMENT_proof proof;
+    BIT_COMMITMENT_proof proof_golden;
+    const char *Sline = "S = ";
+    const char *S1line = "S1 = ";
+    const char *S2line = "S2 = ";
+
+    // Make sure proof is properly zeroed before starting test
+    FF_4096_zero(proof_golden.s,  FFLEN_4096);
+    FF_2048_zero(proof_golden.s1, FFLEN_2048);
+
+    // Line terminating a test vector
+    const char *last_line = S2line;
+
+    /* Test happy path using test vectors */
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_OCTET(fp, &X, line, Xline);
+        scan_OCTET(fp, &E, line, Eline);
+        scan_OCTET(fp, &R, line, Rline);
+        scan_OCTET(fp, &P, line, Pline);
+        scan_OCTET(fp, &Q, line, Qline);
+
+        scan_FF_2048(fp, rv.alpha, line, ALPHAline, HFLEN_2048);
+        scan_FF_2048(fp, rv.beta,  line, BETAline,  FFLEN_2048);
+        scan_FF_2048(fp, rv.gamma, line, GAMMAline, FFLEN_2048 + HFLEN_2048);
+        scan_FF_2048(fp, rv.rho,   line, RHOline,   FFLEN_2048 + HFLEN_2048);
+
+        // Read ground truth
+        scan_FF_4096(fp, proof_golden.s,  line, Sline,  HFLEN_4096);
+        scan_FF_2048(fp, proof_golden.s1, line, S1line, HFLEN_2048);
+        scan_FF_2048(fp, proof_golden.s2, line, S2line, FFLEN_2048 + HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            PAILLIER_KEY_PAIR(NULL, &P, &Q, &pub, &priv);
+
+            BIT_COMMITMENT_prove(&priv, &X, &R, &rv, &E, &proof);
+
+            compare_FF_4096(fp, testNo, "BIT_COMMITMENT_proof p.s",  proof.s,  proof_golden.s,  FFLEN_4096);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_proof p.s1", proof.s1, proof_golden.s1, FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_proof p.s2", proof.s2, proof_golden.s2, FFLEN_2048 + HFLEN_2048);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bc_setup.c b/test/unit/test_bit_commitment_setup.c
similarity index 59%
rename from test/unit/test_bc_setup.c
rename to test/unit/test_bit_commitment_setup.c
index b371215..1ef2497 100644
--- a/test/unit/test_bc_setup.c
+++ b/test/unit/test_bit_commitment_setup.c
@@ -19,7 +19,7 @@
 
 #include <string.h>
 #include "test.h"
-#include "amcl/commitments.h"
+#include "amcl/bit_commitment.h"
 
 /* BC Commitment setup unit tests */
 
@@ -57,12 +57,12 @@ int main(int argc, char **argv)
     octet B0 = {0, sizeof(b0), b0};
     const char *B0line = "B0 = ";
 
-    COMMITMENTS_BC_priv_modulus m;
+    BIT_COMMITMENT_priv m;
     const char *Nline =  "N = ";
     const char *PQline = "PQ = ";
     const char *IPQline = "IPQ = ";
 
-    COMMITMENTS_BC_priv_modulus m_golden;
+    BIT_COMMITMENT_priv m_golden;
     const char *IALPHAline = "IALPHA = ";
     const char *B1line = "B1 = ";
 
@@ -87,30 +87,30 @@ int main(int argc, char **argv)
         scan_OCTET(fp, &B0, line, B0line);
 
         // Ground truth
-        scan_FF_2048(fp, m_golden.P, line, Pline, HFLEN_2048);
-        scan_FF_2048(fp, m_golden.Q, line, Qline, HFLEN_2048);
-        scan_FF_2048(fp, m_golden.invPQ, line, IPQline, HFLEN_2048);
-        scan_FF_2048(fp, m_golden.pq, line, PQline, FFLEN_2048);
-        scan_FF_2048(fp, m_golden.N, line, Nline, FFLEN_2048);
-        scan_FF_2048(fp, m_golden.alpha, line, ALPHAline, FFLEN_2048);
-        scan_FF_2048(fp, m_golden.ialpha, line, IALPHAline, FFLEN_2048);
-        scan_FF_2048(fp, m_golden.b0, line, B0line, FFLEN_2048);
-        scan_FF_2048(fp, m_golden.b1, line, B1line, FFLEN_2048);
+        scan_FF_2048(fp, m_golden.mod.p,     line, Pline,      HFLEN_2048);
+        scan_FF_2048(fp, m_golden.mod.q,     line, Qline,      HFLEN_2048);
+        scan_FF_2048(fp, m_golden.mod.invpq, line, IPQline,    HFLEN_2048);
+        scan_FF_2048(fp, m_golden.pq,        line, PQline,     FFLEN_2048);
+        scan_FF_2048(fp, m_golden.mod.n,     line, Nline,      FFLEN_2048);
+        scan_FF_2048(fp, m_golden.alpha,     line, ALPHAline,  FFLEN_2048);
+        scan_FF_2048(fp, m_golden.ialpha,    line, IALPHAline, FFLEN_2048);
+        scan_FF_2048(fp, m_golden.b0,        line, B0line,     FFLEN_2048);
+        scan_FF_2048(fp, m_golden.b1,        line, B1line,     FFLEN_2048);
 
         // Run test when the whole test vector has been read
         if (!strncmp(line, last_line, strlen(last_line)))
         {
-            COMMITMENTS_BC_setup(NULL, &m, &P, &Q, &B0, &ALPHA);
-
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup P",      m.P,      m_golden.P,      HFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup Q",      m.Q,      m_golden.Q,      HFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup invPQ",  m.invPQ,  m_golden.invPQ,  HFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup N",      m.N,      m_golden.N,      FFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup pq",     m.pq,     m_golden.pq,     FFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup alpha",  m.alpha,  m_golden.alpha,  FFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup ialpha", m.ialpha, m_golden.ialpha, FFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup b0",     m.b0,     m_golden.b0,     FFLEN_2048);
-            compare_FF_2048(fp, testNo, "COMMITMENTS_BC_setup b1",     m.b1,     m_golden.b1,     FFLEN_2048);
+            BIT_COMMITMENT_setup(NULL, &m, &P, &Q, &B0, &ALPHA);
+
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup P",      m.mod.p,     m_golden.mod.p,     HFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup Q",      m.mod.q,     m_golden.mod.q,     HFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup invPQ",  m.mod.invpq, m_golden.mod.invpq, HFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup N",      m.mod.n,     m_golden.mod.n,     FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup pq",     m.pq,        m_golden.pq,        FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup alpha",  m.alpha,     m_golden.alpha,     FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup ialpha", m.ialpha,    m_golden.ialpha,    FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup b0",     m.b0,        m_golden.b0,        FFLEN_2048);
+            compare_FF_2048(fp, testNo, "BIT_COMMITMENT_setup b1",     m.b1,        m_golden.b1,        FFLEN_2048);
 
             // Mark that at least one test vector has been executed
             test_run = 1;
diff --git a/test/unit/test_bc_internals.c b/test/unit/test_bit_commitment_setup_internals.c
similarity index 97%
rename from test/unit/test_bc_internals.c
rename to test/unit/test_bit_commitment_setup_internals.c
index 5663b81..ad0507b 100644
--- a/test/unit/test_bc_internals.c
+++ b/test/unit/test_bit_commitment_setup_internals.c
@@ -19,9 +19,9 @@
 
 #include <string.h>
 #include "test.h"
-#include "commitments.c"
+#include "bit_commitment_setup.c"
 
-/* BC Commitment internals unit tests */
+/* BC Setup internals unit tests */
 
 char *Phex = "CA5F37B7C0DDF6530B30A41116588218DE95F1F36B807FD7C28E4C467EE3F35967BC01D28B71F8A627A353675A81C86A1FF03DCECAF1686891183FA317BA34A4A1148D40A89F1F3AC0C200511C6CFE02342CD75354C25A2E069886DD4FB73BD365660D163F1282B143119AB8F375A73875EC16B634F52593B73BC6D875F2D3EF";
 
diff --git a/test/unit/test_bit_commitment_verify.c b/test/unit/test_bit_commitment_verify.c
new file mode 100644
index 0000000..fc31ac0
--- /dev/null
+++ b/test/unit/test_bit_commitment_verify.c
@@ -0,0 +1,174 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <string.h>
+#include "test.h"
+#include "amcl/bit_commitment.h"
+
+/* Bit Commitment Paillier Plaintext Proof prove unit test */
+
+#define LINE_LEN 2048
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_BIT_COMMITMENT_verify [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int rc;
+    int test_run = 0;
+
+    char err_msg[128];
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIT_COMMITMENT_commitment co;
+    const char *Zline = "Z = ";
+    const char *Uline = "U = ";
+    const char *Wline = "W = ";
+
+    BIT_COMMITMENT_priv m;
+    const char *PTline = "PT = ";
+    const char *QTline = "QT = ";
+    const char *H1line = "H1 = ";
+    const char *H2line = "H2 = ";
+
+    BIT_COMMITMENT_proof proof;
+    const char *Sline =  "S = ";
+    const char *S1line = "S1 = ";
+    const char *S2line = "S2 = ";
+
+    char c[2*FS_2048];
+    octet C = {0, sizeof(c), c};
+    const char *Cline = "C = ";
+
+    char e[EGS_SECP256K1];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    char n[FS_2048];
+    octet N = {0, sizeof(n), n};
+    const char *Nline = "N = ";
+
+    PAILLIER_public_key pub;
+
+    // Make sure proof is properly zeroed before starting test
+    FF_4096_zero(proof.s,  FFLEN_4096);
+    FF_2048_zero(proof.s1, FFLEN_2048);
+
+    // Line terminating a test vector
+    const char *last_line = QTline;
+
+    /* Test happy path using test vectors */
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        // Read inputs
+        scan_OCTET(fp, &C, line, Cline);
+        scan_OCTET(fp, &E, line, Eline);
+        scan_OCTET(fp, &N, line, Nline);
+
+        scan_FF_2048(fp, m.b0,    line, H1line, FFLEN_2048);
+        scan_FF_2048(fp, m.b1,    line, H2line, FFLEN_2048);
+        scan_FF_2048(fp, m.mod.p, line, PTline, HFLEN_2048);
+        scan_FF_2048(fp, m.mod.q, line, QTline, HFLEN_2048);
+
+        scan_FF_2048(fp, co.z, line, Zline, FFLEN_2048);
+        scan_FF_4096(fp, co.u, line, Uline, FFLEN_4096);
+        scan_FF_2048(fp, co.w, line, Wline, FFLEN_2048);
+
+        scan_FF_4096(fp, proof.s,  line, Sline,  HFLEN_4096);
+        scan_FF_2048(fp, proof.s1, line, S1line, HFLEN_2048);
+        scan_FF_2048(fp, proof.s2, line, S2line, FFLEN_2048 + HFLEN_2048);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            PAILLIER_PK_fromOctet(&pub, &N);
+
+            rc = BIT_COMMITMENT_verify(&pub, &m, &C, &co, &E, &proof);
+
+            sprintf(err_msg, "BIT_COMMITMENT_verify OK. rc %d", rc);
+            assert_tv(fp, testNo, err_msg, rc == BIT_COMMITMENT_OK);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test unhappy paths */
+
+    BIT_COMMITMENT_proof tmp;
+
+    FF_4096_copy(tmp.s,  proof.s,  FFLEN_4096);
+    FF_2048_copy(tmp.s1, proof.s1, FFLEN_2048);
+    FF_2048_copy(tmp.s2, proof.s2, FFLEN_2048 + HFLEN_2048);
+
+    rc = BIT_COMMITMENT_verify(&pub, &m, &C, &co, &E, &tmp);
+    assert(NULL, "ERROR copying proof for unhappy path test\n", rc == BIT_COMMITMENT_OK);
+
+    // Test s1 > q^3
+    FF_2048_copy(tmp.s1, tmp.s2, FFLEN_2048);
+
+    rc = BIT_COMMITMENT_verify(&pub, &m, &C, &co, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_verify s1 too long. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    FF_2048_copy(tmp.s1, proof.s1, FFLEN_2048);
+
+    // Test wrong w proof
+    FF_2048_dec(tmp.s1, 1, FFLEN_2048);
+
+    rc = BIT_COMMITMENT_verify(&pub, &m, &C, &co, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_verify wrong w proof. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    FF_2048_copy(tmp.s1, proof.s1, FFLEN_2048);
+
+    // Test wrong u proof
+    FF_4096_dec(tmp.s, 1, FFLEN_4096);
+
+    rc = BIT_COMMITMENT_verify(&pub, &m, &C, &co, &E, &tmp);
+    sprintf(err_msg, "FAILURE BIT_COMMITMENT_verify wrong u proof. rc %d\n", rc);
+    assert(NULL, err_msg, rc == BIT_COMMITMENT_FAIL);
+
+    printf("SUCCESS");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_bit_commitments_muladd_octets.c b/test/unit/test_bit_commitments_muladd_octets.c
new file mode 100644
index 0000000..e69de29
diff --git a/test/unit/test_hidden_dlog_challenge.c b/test/unit/test_hidden_dlog_challenge.c
new file mode 100644
index 0000000..f8fa464
--- /dev/null
+++ b/test/unit/test_hidden_dlog_challenge.c
@@ -0,0 +1,131 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* ZKP of factoring prove unit test */
+
+#include <string.h>
+#include "test.h"
+#include "amcl/hidden_dlog.h"
+
+#define IDLEN 16
+#define ADLEN 16
+#define LINE_LEN 65555
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_hidden_dlog_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIG_1024_58 N[FFLEN_2048];
+    const char *Nline = "N = ";
+
+    BIG_1024_58 B0[FFLEN_2048];
+    const char *B0line = "B0 = ";
+
+    BIG_1024_58 B1[FFLEN_2048];
+    const char *B1line = "B1 = ";
+
+    HDLOG_iter_values RHO;
+    const char *RHOline = "RHO = ";
+
+    char id[IDLEN];
+    octet ID = {0, sizeof(id), id};
+    const char *IDline = "ID = ";
+
+    char ad[ADLEN];
+    octet AD = {0, sizeof(ad), ad};
+    octet *AD_ptr = NULL;
+    const char *ADline = "AD = ";
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    char e_golden[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+    octet E_GOLDEN = {0, sizeof(e_golden), e_golden};
+    const char *Eline = "E = ";
+
+    // Line terminating a test vector
+    const char *last_line = Eline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test happy path using test vectors */
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_FF_2048(fp, N,  line, Nline,  FFLEN_2048);
+        scan_FF_2048(fp, B0, line, B0line, FFLEN_2048);
+        scan_FF_2048(fp, B1, line, B1line, FFLEN_2048);
+
+        scan_HDLOG_iv(fp, RHO, line, RHOline);
+
+        scan_OCTET(fp, &ID, line, IDline);
+        scan_OCTET(fp, &AD, line, ADline);
+
+        scan_OCTET(fp, &E_GOLDEN, line, Eline);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            if (AD.len > 0)
+            {
+                AD_ptr = &AD;
+            }
+
+            HDLOG_challenge(N, B0, B1, RHO, &ID, AD_ptr, &E);
+
+            compare_OCT(fp, testNo, "HDLOG_challenge E", &E, &E_GOLDEN);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+
+            AD_ptr = NULL;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test unhappy path */
+
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_hidden_dlog_commit.c b/test/unit/test_hidden_dlog_commit.c
new file mode 100644
index 0000000..e194164
--- /dev/null
+++ b/test/unit/test_hidden_dlog_commit.c
@@ -0,0 +1,114 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* ZKP of factoring prove unit test */
+
+#include <string.h>
+#include "test.h"
+#include "amcl/hidden_dlog.h"
+
+#define LINE_LEN 65555
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_hidden_dlog_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    char p[HFS_2048];
+    octet P = {0, sizeof(p), p};
+    const char *Pline = "P = ";
+
+    char q[HFS_2048];
+    octet Q = {0, sizeof(q), q};
+    const char *Qline = "Q = ";
+
+    BIG_1024_58 ord[FFLEN_2048];
+    const char *ORDline = "ORD = ";
+
+    BIG_1024_58 b0[FFLEN_2048];
+    const char *B0line = "B0 = ";
+
+    HDLOG_iter_values R;
+    const char *Rline = "R = ";
+
+    HDLOG_iter_values RHO;
+    HDLOG_iter_values RHOgolden;
+    const char *RHOline = "RHO = ";
+
+    MODULUS_priv m;
+
+    // Line terminating a test vector
+    const char *last_line = RHOline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test happy path using test vectors */
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_OCTET(fp, &P, line, Pline);
+        scan_OCTET(fp, &Q, line, Qline);
+
+        scan_FF_2048(fp, ord, line, ORDline, FFLEN_2048);
+        scan_FF_2048(fp, b0,  line, B0line,  FFLEN_2048);
+
+        scan_HDLOG_iv(fp, R,         line, Rline);
+        scan_HDLOG_iv(fp, RHOgolden, line, RHOline);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            MODULUS_fromOctets(&m, &P, &Q);
+            HDLOG_commit(NULL, &m, ord, b0, R, RHO);
+
+            compare_HDLOG_iv(fp, testNo, "HDLOG_commit RHO", RHO, RHOgolden);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_hidden_dlog_prove.c b/test/unit/test_hidden_dlog_prove.c
new file mode 100644
index 0000000..f2fe630
--- /dev/null
+++ b/test/unit/test_hidden_dlog_prove.c
@@ -0,0 +1,106 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* ZKP of factoring prove unit test */
+
+#include <string.h>
+#include "test.h"
+#include "amcl/hidden_dlog.h"
+
+#define LINE_LEN 65555
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_hidden_dlog_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIG_1024_58 ord[FFLEN_2048];
+    const char *ORDline = "ORD = ";
+
+    BIG_1024_58 alpha[FFLEN_2048];
+    const char *ALPHAline = "ALPHA = ";
+
+    HDLOG_iter_values R;
+    const char *Rline = "R = ";
+
+    HDLOG_iter_values T;
+    HDLOG_iter_values Tgolden;
+    const char *Tline = "T = ";
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    // Line terminating a test vector
+    const char *last_line = Tline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test happy path using test vectors */
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_FF_2048(fp, ord,   line, ORDline,   FFLEN_2048);
+        scan_FF_2048(fp, alpha, line, ALPHAline, FFLEN_2048);
+
+        scan_HDLOG_iv(fp, R,       line, Rline);
+        scan_HDLOG_iv(fp, Tgolden, line, Tline);
+
+        scan_OCTET(fp, &E, line, Eline);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            HDLOG_prove(ord, alpha, R, &E, T);
+
+            compare_HDLOG_iv(fp, testNo, "HDLOG_prove T", T, Tgolden);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_hidden_dlog_verify.c b/test/unit/test_hidden_dlog_verify.c
new file mode 100644
index 0000000..4acf8db
--- /dev/null
+++ b/test/unit/test_hidden_dlog_verify.c
@@ -0,0 +1,117 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* ZKP of factoring prove unit test */
+
+#include <string.h>
+#include "test.h"
+#include "amcl/hidden_dlog.h"
+
+#define LINE_LEN 65555
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_hidden_dlog_commit [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int rc;
+    int test_run = 0;
+
+    FILE *fp;
+    char line[LINE_LEN] = {0};
+
+    const char *TESTline = "TEST = ";
+    int testNo = 0;
+
+    BIG_1024_58 N[FFLEN_2048];
+    const char *Nline = "N = ";
+
+    BIG_1024_58 B0[FFLEN_2048];
+    const char *B0line = "B0 = ";
+
+    BIG_1024_58 B1[FFLEN_2048];
+    const char *B1line = "B1 = ";
+
+    HDLOG_iter_values RHO;
+    const char *RHOline = "RHO = ";
+
+    HDLOG_iter_values T;
+    const char *Tline = "T = ";
+
+    char e[HDLOG_CHALLENGE_SIZE];
+    octet E = {0, sizeof(e), e};
+    const char *Eline = "E = ";
+
+    // Line terminating a test vector
+    const char *last_line = Tline;
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test happy path using test vectors */
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        scan_int(&testNo, line, TESTline);
+
+        scan_FF_2048(fp, N,  line, Nline,  FFLEN_2048);
+        scan_FF_2048(fp, B0, line, B0line, FFLEN_2048);
+        scan_FF_2048(fp, B1, line, B1line, FFLEN_2048);
+
+        scan_HDLOG_iv(fp, RHO, line, RHOline);
+        scan_HDLOG_iv(fp, T,   line, Tline);
+
+        scan_OCTET(fp, &E, line, Eline);
+
+        if (!strncmp(line, last_line, strlen(last_line)))
+        {
+            rc = HDLOG_verify(N, B0, B1, RHO, &E, T);
+
+            assert_tv(fp, testNo, "HDLOG_verify", rc == HDLOG_OK);
+
+            // Mark that at least one test vector was executed
+            test_run = 1;
+        }
+    }
+
+    fclose(fp);
+
+    if (test_run == 0)
+    {
+        printf("ERROR no test vector was executed\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test unhappy path */
+    FF_2048_zero(T[1], FFLEN_2048);
+
+    rc = HDLOG_verify(N, B0, B1, RHO, &E, T);
+
+    assert(NULL, "HDLOG_verify. Invalid proof", rc == HDLOG_FAIL);
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/unit/test_nm_commit.c b/test/unit/test_nm_commit.c
index b6ff0d0..cf7259a 100644
--- a/test/unit/test_nm_commit.c
+++ b/test/unit/test_nm_commit.c
@@ -19,7 +19,7 @@
 
 #include <string.h>
 #include "test.h"
-#include "amcl/commitments.h"
+#include "amcl/nm_commitment.h"
 
 /* NM Commitment unit tests */
 
@@ -82,11 +82,11 @@ int main(int argc, char **argv)
 
         if (!strncmp(line, last_line, strlen(last_line)))
         {
-            COMMITMENTS_NM_commit(NULL, &X_GOLDEN, &R_GOLDEN, &C);
+            NM_COMMITMENT_commit(NULL, &X_GOLDEN, &R_GOLDEN, &C);
             compare_OCT(fp, testNo, "COMMITMENT_NM_commit", &C_GOLDEN, &C);
 
-            rc = COMMITMENTS_NM_decommit(&X_GOLDEN, &R_GOLDEN, &C_GOLDEN);
-            assert_tv(fp, testNo, "COMMITMENTS_NM_DECOMMIT", rc == COMMITMENTS_OK);
+            rc = NM_COMMITMENT_decommit(&X_GOLDEN, &R_GOLDEN, &C_GOLDEN);
+            assert_tv(fp, testNo, "NM_COMMITMENT_DECOMMIT", rc == NM_COMMITMENT_OK);
 
             // Mark that at least one test vector was executed
             test_run = 1;
@@ -101,21 +101,21 @@ int main(int argc, char **argv)
         exit(EXIT_FAILURE);
     }
 
-    /* Test COMMITMENTS_NM_decommit unhappy paths */
+    /* Test NM_COMMITMENT_decommit unhappy paths */
 
     // Test invalid length of decommitment
     OCT_copy(&R, &R_GOLDEN);
     R.len--;
 
-    rc = COMMITMENTS_NM_decommit(&X_GOLDEN, &R, &C_GOLDEN);
-    assert(NULL, "COMMITMENTS_NM_decommit. Invalid R length", rc == COMMITMENTS_FAIL);
+    rc = NM_COMMITMENT_decommit(&X_GOLDEN, &R, &C_GOLDEN);
+    assert(NULL, "NM_COMMITMENT_decommit. Invalid R length", rc == NM_COMMITMENT_FAIL);
 
     // Test wrong decommitment
     OCT_copy(&R, &R_GOLDEN);
     R.val[0]--;
 
-    rc = COMMITMENTS_NM_decommit(&X_GOLDEN, &R, &C_GOLDEN);
-    assert(NULL, "COMMITMENTS_NM_decommit. Invalid R", rc == COMMITMENTS_FAIL);
+    rc = NM_COMMITMENT_decommit(&X_GOLDEN, &R, &C_GOLDEN);
+    assert(NULL, "NM_COMMITMENT_decommit. Invalid R", rc == NM_COMMITMENT_FAIL);
 
     printf("SUCCESS");
     exit(EXIT_SUCCESS);
diff --git a/testVectors/bit_commitment/ecp_commit.json b/testVectors/bit_commitment/ecp_commit.json
new file mode 100644
index 0000000..91d544b
--- /dev/null
+++ b/testVectors/bit_commitment/ecp_commit.json
@@ -0,0 +1,52 @@
+[
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000d41b73a4a135de46c57830c4812006305031559d702732f9e5ca02340439c5ea65fbc49855a60aa17ca605ecf05047de6e540528dca5736f9b04acdd6761f18b155751bed6a2f506aa348a001b7999c62b3e5db3a100423c29bbbf1ad0ed8166",
+    "R": "020759c4cc7ef438eb07168ecd6db407c2e81ee14f0109e8745a185bad9afa9f66",
+    "U": "02d2dc3c4b831cef085d22abb8ad88cae611b93efa8b4a8e2f62d40f41b72620ab"
+  },
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000ea7814a78384576f1cdec3ff401c7bd4425b3b4eb0eedf9274d7696c469333fbb465fbba906eac04bd48adc8d917b8aa52f2023b1afb5b15638059f30fa70151276986b0b2040e07e64d8100349cc22a9405e96c897a27656c4d7a0c96ea3942",
+    "R": "02c559f06a55ada6ba55c54696e8693c169668e5a4940a9b577f07076a62e54c98",
+    "U": "02e69f2192caf4ce255e680685dce947ec3781e23a35bb0b314b29abd1c01dfe32"
+  },
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000fe62638a8dffebdf42165c552353f4964050b7134e23d38e38d3ff84cf6bc9cc3d3633b4fbb41ad14e39c07eed2fd59315073cdb28ef4d8f07cb0ccf8b3aa505a64c85d305b80fa8aa24994d125950280eeec17a95137f2373716ad5fc0bfd76",
+    "R": "02b0c02c266c90b696a6a60b9bb6108316a13e6c2c2f0935f19561ff4319bc2d70",
+    "U": "0355603a136f480fa893e582096c8af0c52b11e44787a40eaf7ed4a29598c90b26"
+  },
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000102c9606abc41cc4eac3e579a124f916ae21aa6f14cdab3929d35d79642fa2aba216d04b82aa7ab6814e95c70bf28772b33a7c2b8f5b75f72d9e7e8da4ba74699e3dc4790b3f9d78d8e8e1cd13406370ac0f7575e367c92e07ef8b74a52e89ca",
+    "R": "02bb770a90b3bce629e1a69ad049c8d5e713b7c56701f285c9c4619e8bf0810b12",
+    "U": "02cb38a2de87ca73e2a41063fbffd6b3f3224740e34d201501f81a359c5f83dca4"
+  },
+  {
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000002d5d8c92426f869b855cb9931d799f49222a4db334c4b6ebb52b208574dbf8f54e977b32e8cf90c078e38ac84203a84638612cd6633a26ccd7ab4ebac6ddb6b836375422ea576752d440c66878469c5c19dc0f4ab5b29f6b2a5bf80be0df3374",
+    "R": "023176cc9a501a76c490c5e27d7569de3b50d21539aa5070842a1edb971af10ecc",
+    "U": "0204078d48ee1922c06375f4dc8f5ddb75600729e85916a5c0a3ff3cb8b896c63c"
+  },
+  {
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000004958ee6454ca8ad63c8af0e40015295bc093ee1fe6a248447b7da84656479ddfcad56494e85ebd779b69f2d43e38ac92f6e86523655156e76a0422ba8d57ea91245d7c9dc26923598c6d49eef86079f38fbb0bb09977b10ef49ecec2e1a6ec50",
+    "R": "031be84a85adc317058312f628926493ea75967098643f8ab0320f4a4ac828b50c",
+    "U": "026dd1e2c47bfc00a154781e0068130dd189903a57b1cc51361eabea13e22b9522"
+  },
+  {
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000004c58ec925aa4d4f545d1e143225e8f1beea275c6cceb846426c307aa231a6ea7755177219b4a227f135235b6ae23e3b4e0e826651d320faa33e8b140fd5f2270a56d83ee321b7f75aaca175ba2b5c4b717cf445be12975bd0542877b362dd329",
+    "R": "021c60d14e65785ab30ddecbdcf92feb2cadaf195fea08ebd4b909d57e0522cf66",
+    "U": "03bb679fa100d1f8b58cf8c90467efdce989a58f547999d349bea38b5923ba1c9a"
+  },
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000a36e77f89b7bcb899f2e521841c1cd0bf3a63f0208f079e3816e084f5f60db518c285363d98f26f97275da7a890e53fccdb724354b1d0513d95d4198393821b0753b2fb848a5c3ddc7c6f8f2cddfeac9e2b8f531c54c322493129fd01e073b59",
+    "R": "02a123d9ba15f5a82e1de608047acf25c9ce4536492562420c32492156dfc32b57",
+    "U": "02b9629cdedc12086b138005b56c859918dd02d6a7d6e7c30145049243c9c8df9b"
+  },
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000531a0574e9938146f7c0d2b2fd6657a3b14cb57134147bc617e2c77608711635a0027b21e463821d123b711e2db6d1c4cca9ca7b83509cd18b5473b170b054525085c39968278a701ecc0d003f4d723f6bcad43bc644eec070a19df3086ba86b",
+    "R": "02f90770b366def0d55dfe116e8a12f9cfc5abd4d787c6e15ad7234c3c1a9abd31",
+    "U": "030ddf20c34a85aa1f5869a89930286d5dab71909597b813d19996a09965098783"
+  },
+  {
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000f3f2c9346e49d0b4fd1892e8dab2d7b2696a2655fe105622d4afd80f79fdf556fa06ef5173f90f1d0a260ed1623754ee8b2a1e5a272ca643ea86608f59676d5fc32c2b1519d703254568a6bab50be017ccb8de9e106f44023390899632595c71",
+    "R": "028804829aa422749ffe7ac093ecbf1c72948b5a113fe0248f10437b69852c7dee",
+    "U": "03e1f698900ee524d9a72205d80cbde7a624f510461a00e938f281aca2698f0fce"
+  }
+]
\ No newline at end of file
diff --git a/testVectors/bit_commitment/ecp_commit.txt b/testVectors/bit_commitment/ecp_commit.txt
new file mode 100644
index 0000000..c2e66df
--- /dev/null
+++ b/testVectors/bit_commitment/ecp_commit.txt
@@ -0,0 +1,40 @@
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000d41b73a4a135de46c57830c4812006305031559d702732f9e5ca02340439c5ea65fbc49855a60aa17ca605ecf05047de6e540528dca5736f9b04acdd6761f18b155751bed6a2f506aa348a001b7999c62b3e5db3a100423c29bbbf1ad0ed8166,
+R = 020759c4cc7ef438eb07168ecd6db407c2e81ee14f0109e8745a185bad9afa9f66,
+U = 02d2dc3c4b831cef085d22abb8ad88cae611b93efa8b4a8e2f62d40f41b72620ab,
+
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000ea7814a78384576f1cdec3ff401c7bd4425b3b4eb0eedf9274d7696c469333fbb465fbba906eac04bd48adc8d917b8aa52f2023b1afb5b15638059f30fa70151276986b0b2040e07e64d8100349cc22a9405e96c897a27656c4d7a0c96ea3942,
+R = 02c559f06a55ada6ba55c54696e8693c169668e5a4940a9b577f07076a62e54c98,
+U = 02e69f2192caf4ce255e680685dce947ec3781e23a35bb0b314b29abd1c01dfe32,
+
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000fe62638a8dffebdf42165c552353f4964050b7134e23d38e38d3ff84cf6bc9cc3d3633b4fbb41ad14e39c07eed2fd59315073cdb28ef4d8f07cb0ccf8b3aa505a64c85d305b80fa8aa24994d125950280eeec17a95137f2373716ad5fc0bfd76,
+R = 02b0c02c266c90b696a6a60b9bb6108316a13e6c2c2f0935f19561ff4319bc2d70,
+U = 0355603a136f480fa893e582096c8af0c52b11e44787a40eaf7ed4a29598c90b26,
+
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000102c9606abc41cc4eac3e579a124f916ae21aa6f14cdab3929d35d79642fa2aba216d04b82aa7ab6814e95c70bf28772b33a7c2b8f5b75f72d9e7e8da4ba74699e3dc4790b3f9d78d8e8e1cd13406370ac0f7575e367c92e07ef8b74a52e89ca,
+R = 02bb770a90b3bce629e1a69ad049c8d5e713b7c56701f285c9c4619e8bf0810b12,
+U = 02cb38a2de87ca73e2a41063fbffd6b3f3224740e34d201501f81a359c5f83dca4,
+
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000002d5d8c92426f869b855cb9931d799f49222a4db334c4b6ebb52b208574dbf8f54e977b32e8cf90c078e38ac84203a84638612cd6633a26ccd7ab4ebac6ddb6b836375422ea576752d440c66878469c5c19dc0f4ab5b29f6b2a5bf80be0df3374,
+R = 023176cc9a501a76c490c5e27d7569de3b50d21539aa5070842a1edb971af10ecc,
+U = 0204078d48ee1922c06375f4dc8f5ddb75600729e85916a5c0a3ff3cb8b896c63c,
+
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000004958ee6454ca8ad63c8af0e40015295bc093ee1fe6a248447b7da84656479ddfcad56494e85ebd779b69f2d43e38ac92f6e86523655156e76a0422ba8d57ea91245d7c9dc26923598c6d49eef86079f38fbb0bb09977b10ef49ecec2e1a6ec50,
+R = 031be84a85adc317058312f628926493ea75967098643f8ab0320f4a4ac828b50c,
+U = 026dd1e2c47bfc00a154781e0068130dd189903a57b1cc51361eabea13e22b9522,
+
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000004c58ec925aa4d4f545d1e143225e8f1beea275c6cceb846426c307aa231a6ea7755177219b4a227f135235b6ae23e3b4e0e826651d320faa33e8b140fd5f2270a56d83ee321b7f75aaca175ba2b5c4b717cf445be12975bd0542877b362dd329,
+R = 021c60d14e65785ab30ddecbdcf92feb2cadaf195fea08ebd4b909d57e0522cf66,
+U = 03bb679fa100d1f8b58cf8c90467efdce989a58f547999d349bea38b5923ba1c9a,
+
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000a36e77f89b7bcb899f2e521841c1cd0bf3a63f0208f079e3816e084f5f60db518c285363d98f26f97275da7a890e53fccdb724354b1d0513d95d4198393821b0753b2fb848a5c3ddc7c6f8f2cddfeac9e2b8f531c54c322493129fd01e073b59,
+R = 02a123d9ba15f5a82e1de608047acf25c9ce4536492562420c32492156dfc32b57,
+U = 02b9629cdedc12086b138005b56c859918dd02d6a7d6e7c30145049243c9c8df9b,
+
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000531a0574e9938146f7c0d2b2fd6657a3b14cb57134147bc617e2c77608711635a0027b21e463821d123b711e2db6d1c4cca9ca7b83509cd18b5473b170b054525085c39968278a701ecc0d003f4d723f6bcad43bc644eec070a19df3086ba86b,
+R = 02f90770b366def0d55dfe116e8a12f9cfc5abd4d787c6e15ad7234c3c1a9abd31,
+U = 030ddf20c34a85aa1f5869a89930286d5dab71909597b813d19996a09965098783,
+
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000f3f2c9346e49d0b4fd1892e8dab2d7b2696a2655fe105622d4afd80f79fdf556fa06ef5173f90f1d0a260ed1623754ee8b2a1e5a272ca643ea86608f59676d5fc32c2b1519d703254568a6bab50be017ccb8de9e106f44023390899632595c71,
+R = 028804829aa422749ffe7ac093ecbf1c72948b5a113fe0248f10437b69852c7dee,
+U = 03e1f698900ee524d9a72205d80cbde7a624f510461a00e938f281aca2698f0fce,
+
diff --git a/testVectors/bit_commitment/ecp_verify.json b/testVectors/bit_commitment/ecp_verify.json
new file mode 100644
index 0000000..c9ce8b7
--- /dev/null
+++ b/testVectors/bit_commitment/ecp_verify.json
@@ -0,0 +1,72 @@
+[
+  {
+    "R": "028af1c4e8d5695bf0f8beada21fae12840e9d35bae7248fa0d1a8e4c9c3a84a5f",
+    "X": "03c183bbab757f68078d02bbe921646ed35b1a03cc3ccc6fe2e1d656dc361bfe8e",
+    "U": "02119be6a181b7594631fd00c26539069876c9d8c2abec105e3824930778265802",
+    "E": "7b57aea7131bd503b5754a2d7a80106469975d39983b9e0352e3323e3afabcaa",
+    "S1": "000000000000000000000000000000000000000000000000000000000000000025a3df222b16806acff67d67431c295a4a7a9b0f21f471a41ad47c3bc3f5da04d096607af47ccfd52da4c4e5481012ca2fb77b2d1808a6fa8d4cfa6aa55117e90224ca8497b326f1990a9d7e8878ac3be39e688b444e8c847debb7b70cf98314"
+  },
+  {
+    "R": "026cec20348dbd224b477c9f2cd08a84ba34a29236499369f79407c86aff7d2a52",
+    "X": "03eb04dde2977fcd9671b3fb11ec8d5bf4a3052a744f0322eebfaf873b0742080f",
+    "U": "023e2c74606206ca37720dab411e1ee506f25db299a1b5064980cd707c39a7ba60",
+    "E": "8dff79089106ee5a18cc84a89c1c87231240233f209a2ec51f2857dd93a26b79",
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000e693bce764f460a771389c9236bb93ae0810c6d4af89926f91385d8a0b057269fe0e4a170fc869f393ee9223cb571d2eed8570a3ab5463fd4c150e4e8b762464f38e0a0e98e743ae049f40295cf63190b385ccf9da887d3695dbcaaa5e92ae68"
+  },
+  {
+    "R": "0295bb82b13e23993ce6b65cd93cbcf6ea855c6678de781b978ad286b550e8d504",
+    "X": "03579c9ef02e33a9dbeb945ed2dfeb8e5043176e3edf78ea80ed9c9e26d0e4772d",
+    "U": "03c060907a1a5634b5bb5e3bceed67b62db90bb06781b2dac0b5b1ed317a83123b",
+    "E": "70c72be99c35bc14c8aa468694b0fc39a5a054df9742f954b766facf781b0df4",
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000a1ead5a573438f810de3c72ea88445cad6705d5bdc23597a9a70bf89b4dc8ca8d4a85845bd5fd8df1aa565975b1a60c08d32f1cbbf5adfdcfcb1e6797d8754f399ed7cef08e2ca57228083a3fe2042cdb14664ee0094fd67b0e3e96b0a6073c9"
+  },
+  {
+    "R": "02e0b74c687e54fa1d70064c2f754a7d4938fd841c0677b28441ef7f76cc024e21",
+    "X": "03e32a0fd36877df9621ef001e974436947dbe7317e92f344060d0b5ac0a5f8548",
+    "U": "0248e0d5fd6c403cb566b384cafb2d9fe4ff4f788ff56904cadf0bd2d67f9a4815",
+    "E": "52dec3a03f22acaff342b8c77196dda6f67cd05c6b3346684c650c7e12d327e7",
+    "S1": "00000000000000000000000000000000000000000000000000000000000000003dd30bb6467fac8682a048146461082d6cc7e816becf79ac44cfc71883508ef488bb962b0c403aded0d912a2a92a073e6a75477f64665816e88ef8a6dc351e299f9c5fb8c6115c073c4b87b3d8fb8f64284f4a9a10a7aa1cdeb33e0a305f2e59"
+  },
+  {
+    "R": "03d73e1b6750fb33fd7a6413540eeb7ae9edfc5834f585a2c474fb57d514c118c6",
+    "X": "02add1793c9ee0fe68ea3244fddf8db0ddbfe4aa0e087a957182d37b12f8c00143",
+    "U": "032757f56072f1f7f548934466ad49837561935be95f35709c29428de0e79896a9",
+    "E": "734e757cfb000c4c8bc1380973cd32da4d5de98579ad2d5be0070749907bbea3",
+    "S1": "000000000000000000000000000000000000000000000000000000000000000050d2cb91ba85748f5e6b36ca3337eb85f979d4677ecb243bdd85d026d8c65748b4569d32385abe9511d8815ee481af76c244d89cf6c58e3fd6706d758cc3d91f2abe41c8f02351723ef323c1585943cbc824d8542be0a296c9fc52267ef52019"
+  },
+  {
+    "R": "02b974c477c9db1d1fee0a84365e85cb72871c17c66ca58ab8c69027140b8d8911",
+    "X": "0319de99fdb3d6d199fd3d5d4f671b91f48cbce91cb83f01433d07b7d04ad0c698",
+    "U": "03610c875bff2274f9335b5624ade8cf82a3727d85d49bdedc82f0f71c7feb7731",
+    "E": "d4e22fff1f4c569c2f44485de8c50941045444d341c14101a810e1aca2d802c4",
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000bf8642a8b189b05e978ce6dac98fc7d691d8ce300c4bea5ddd952cc99181114b960ddce118cc1bac1841efea66d35bf4c0251ec0040668236ea6078782ad63d2cf044030d3f785fb578f491eb856ac6c6fd5ac74a897d8c54a60e399456d05fb"
+  },
+  {
+    "R": "028807409bc188612cefbba9065f43d0372b5d27082151e3451f656ab73f7b5e8a",
+    "X": "03ee9d482abcdbf3d3bb2628e4431686a3e2816bcab8e3a49c9e176fe31ee1b41f",
+    "U": "03efc5792d56071fce6d41528d1689e6924c696c98f0ae08a71c34155a73fb4be2",
+    "E": "b5e33b6e1112c004aca94916bb0d398632cdab8bf39801dc2fdb6ec4d60ea335",
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000cccc0aa67d773821d581648973bc9c04447b9f611a2e1804eefd590ea07b40bb4aad34d73fe428995c993e6d7c970acdc4072d66194678e0254ed5cbb9bc85a3e024cccd6eb64b56a922c1a11222ee0238553b8ecef9158c88098166a6f35e8b"
+  },
+  {
+    "R": "03d72f06eb81e0b342d297c42a2d04108fe52c141dd14cbc74721db7dad3c732ed",
+    "X": "02ce0ca22608067fd35470fecf6b63bb033d418d9345122c9af52229a258d26358",
+    "U": "036f45142ff1c1470671c270ff6be745c31e962762c07ef1b78befdf2554f629ec",
+    "E": "590ec03512b886180a6fe804d220852d1f78255ea3b0a15f0e3d498541afd1f6",
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000b1ade7b21015d0eb56000b57b94b52ec64cfa7fb97f9ea49382678f15b2c115453d66d3bfcdf0baa0b1a1a97ab91bdd14b4265eca53f15d96d8220739af615f799da3311754e3310d1b2fe9b1b3c20e6038aabac29e3b52b29de73f192188b8b"
+  },
+  {
+    "R": "0248784958604353a67a7aa860c1ffbde9cbae655cd2c6037510c7a39bdb52bdbe",
+    "X": "02bc0fe6ddd7c14a8fe3e4c6071539f149dbe750b3539042648bfdf2de7d714cc7",
+    "U": "037f0d72f9fd53b239d7303d5bd0926f3effe131b0344dac1fcd26c17ff620f4e2",
+    "E": "a58c7b98b3eca59ea017c66c0688211f94bf98339cf6d5fc71d7ca5c739a6deb",
+    "S1": "000000000000000000000000000000000000000000000000000000000000000030f0c03422945d13d197ea02436deb80b867f6b546fbb6baf4f8b23390381650a2ad839623a1c39e5b12d5591fc2849393861d6b3c5544872ac675c25a7a4d6c94bf77e74de1ae24aa7616d2c3796e2532b73aed76e76ddbe20a8884e11164e7"
+  },
+  {
+    "R": "026fe4e1fba0595422479d2b2b48cd38205b7aa7efc293b7cfdf93a858e6d0cd32",
+    "X": "03ff70e1fe57cc7e3441aa0795b99297b559f71b7921e163601c477329f7fe68e1",
+    "U": "022e454696ab9e0d192442afa5a0f86fa04ba274a5c51880dc05e07acb008d3c09",
+    "E": "d56f0586b3d695aa031b493eed1f55401efdb91a87e59e18d46cfd0676259031",
+    "S1": "00000000000000000000000000000000000000000000000000000000000000006573265bc235466b469b1bd70b37af5a8604618e80e411b640f846b9ec8ef19e3449b341f27ca13749b2b59d275d3ac28903112c54e24d828d59cbe36788874235dc087dedf9f5632492e6e2560b2aad766db1580e1b18b4a91e5c4d8773b4d3"
+  }
+]
\ No newline at end of file
diff --git a/testVectors/bit_commitment/ecp_verify.txt b/testVectors/bit_commitment/ecp_verify.txt
new file mode 100644
index 0000000..036cd0f
--- /dev/null
+++ b/testVectors/bit_commitment/ecp_verify.txt
@@ -0,0 +1,60 @@
+R = 028af1c4e8d5695bf0f8beada21fae12840e9d35bae7248fa0d1a8e4c9c3a84a5f,
+X = 03c183bbab757f68078d02bbe921646ed35b1a03cc3ccc6fe2e1d656dc361bfe8e,
+U = 02119be6a181b7594631fd00c26539069876c9d8c2abec105e3824930778265802,
+E = 7b57aea7131bd503b5754a2d7a80106469975d39983b9e0352e3323e3afabcaa,
+S1 = 000000000000000000000000000000000000000000000000000000000000000025a3df222b16806acff67d67431c295a4a7a9b0f21f471a41ad47c3bc3f5da04d096607af47ccfd52da4c4e5481012ca2fb77b2d1808a6fa8d4cfa6aa55117e90224ca8497b326f1990a9d7e8878ac3be39e688b444e8c847debb7b70cf98314,
+
+R = 026cec20348dbd224b477c9f2cd08a84ba34a29236499369f79407c86aff7d2a52,
+X = 03eb04dde2977fcd9671b3fb11ec8d5bf4a3052a744f0322eebfaf873b0742080f,
+U = 023e2c74606206ca37720dab411e1ee506f25db299a1b5064980cd707c39a7ba60,
+E = 8dff79089106ee5a18cc84a89c1c87231240233f209a2ec51f2857dd93a26b79,
+S1 = 0000000000000000000000000000000000000000000000000000000000000000e693bce764f460a771389c9236bb93ae0810c6d4af89926f91385d8a0b057269fe0e4a170fc869f393ee9223cb571d2eed8570a3ab5463fd4c150e4e8b762464f38e0a0e98e743ae049f40295cf63190b385ccf9da887d3695dbcaaa5e92ae68,
+
+R = 0295bb82b13e23993ce6b65cd93cbcf6ea855c6678de781b978ad286b550e8d504,
+X = 03579c9ef02e33a9dbeb945ed2dfeb8e5043176e3edf78ea80ed9c9e26d0e4772d,
+U = 03c060907a1a5634b5bb5e3bceed67b62db90bb06781b2dac0b5b1ed317a83123b,
+E = 70c72be99c35bc14c8aa468694b0fc39a5a054df9742f954b766facf781b0df4,
+S1 = 0000000000000000000000000000000000000000000000000000000000000000a1ead5a573438f810de3c72ea88445cad6705d5bdc23597a9a70bf89b4dc8ca8d4a85845bd5fd8df1aa565975b1a60c08d32f1cbbf5adfdcfcb1e6797d8754f399ed7cef08e2ca57228083a3fe2042cdb14664ee0094fd67b0e3e96b0a6073c9,
+
+R = 02e0b74c687e54fa1d70064c2f754a7d4938fd841c0677b28441ef7f76cc024e21,
+X = 03e32a0fd36877df9621ef001e974436947dbe7317e92f344060d0b5ac0a5f8548,
+U = 0248e0d5fd6c403cb566b384cafb2d9fe4ff4f788ff56904cadf0bd2d67f9a4815,
+E = 52dec3a03f22acaff342b8c77196dda6f67cd05c6b3346684c650c7e12d327e7,
+S1 = 00000000000000000000000000000000000000000000000000000000000000003dd30bb6467fac8682a048146461082d6cc7e816becf79ac44cfc71883508ef488bb962b0c403aded0d912a2a92a073e6a75477f64665816e88ef8a6dc351e299f9c5fb8c6115c073c4b87b3d8fb8f64284f4a9a10a7aa1cdeb33e0a305f2e59,
+
+R = 03d73e1b6750fb33fd7a6413540eeb7ae9edfc5834f585a2c474fb57d514c118c6,
+X = 02add1793c9ee0fe68ea3244fddf8db0ddbfe4aa0e087a957182d37b12f8c00143,
+U = 032757f56072f1f7f548934466ad49837561935be95f35709c29428de0e79896a9,
+E = 734e757cfb000c4c8bc1380973cd32da4d5de98579ad2d5be0070749907bbea3,
+S1 = 000000000000000000000000000000000000000000000000000000000000000050d2cb91ba85748f5e6b36ca3337eb85f979d4677ecb243bdd85d026d8c65748b4569d32385abe9511d8815ee481af76c244d89cf6c58e3fd6706d758cc3d91f2abe41c8f02351723ef323c1585943cbc824d8542be0a296c9fc52267ef52019,
+
+R = 02b974c477c9db1d1fee0a84365e85cb72871c17c66ca58ab8c69027140b8d8911,
+X = 0319de99fdb3d6d199fd3d5d4f671b91f48cbce91cb83f01433d07b7d04ad0c698,
+U = 03610c875bff2274f9335b5624ade8cf82a3727d85d49bdedc82f0f71c7feb7731,
+E = d4e22fff1f4c569c2f44485de8c50941045444d341c14101a810e1aca2d802c4,
+S1 = 0000000000000000000000000000000000000000000000000000000000000000bf8642a8b189b05e978ce6dac98fc7d691d8ce300c4bea5ddd952cc99181114b960ddce118cc1bac1841efea66d35bf4c0251ec0040668236ea6078782ad63d2cf044030d3f785fb578f491eb856ac6c6fd5ac74a897d8c54a60e399456d05fb,
+
+R = 028807409bc188612cefbba9065f43d0372b5d27082151e3451f656ab73f7b5e8a,
+X = 03ee9d482abcdbf3d3bb2628e4431686a3e2816bcab8e3a49c9e176fe31ee1b41f,
+U = 03efc5792d56071fce6d41528d1689e6924c696c98f0ae08a71c34155a73fb4be2,
+E = b5e33b6e1112c004aca94916bb0d398632cdab8bf39801dc2fdb6ec4d60ea335,
+S1 = 0000000000000000000000000000000000000000000000000000000000000000cccc0aa67d773821d581648973bc9c04447b9f611a2e1804eefd590ea07b40bb4aad34d73fe428995c993e6d7c970acdc4072d66194678e0254ed5cbb9bc85a3e024cccd6eb64b56a922c1a11222ee0238553b8ecef9158c88098166a6f35e8b,
+
+R = 03d72f06eb81e0b342d297c42a2d04108fe52c141dd14cbc74721db7dad3c732ed,
+X = 02ce0ca22608067fd35470fecf6b63bb033d418d9345122c9af52229a258d26358,
+U = 036f45142ff1c1470671c270ff6be745c31e962762c07ef1b78befdf2554f629ec,
+E = 590ec03512b886180a6fe804d220852d1f78255ea3b0a15f0e3d498541afd1f6,
+S1 = 0000000000000000000000000000000000000000000000000000000000000000b1ade7b21015d0eb56000b57b94b52ec64cfa7fb97f9ea49382678f15b2c115453d66d3bfcdf0baa0b1a1a97ab91bdd14b4265eca53f15d96d8220739af615f799da3311754e3310d1b2fe9b1b3c20e6038aabac29e3b52b29de73f192188b8b,
+
+R = 0248784958604353a67a7aa860c1ffbde9cbae655cd2c6037510c7a39bdb52bdbe,
+X = 02bc0fe6ddd7c14a8fe3e4c6071539f149dbe750b3539042648bfdf2de7d714cc7,
+U = 037f0d72f9fd53b239d7303d5bd0926f3effe131b0344dac1fcd26c17ff620f4e2,
+E = a58c7b98b3eca59ea017c66c0688211f94bf98339cf6d5fc71d7ca5c739a6deb,
+S1 = 000000000000000000000000000000000000000000000000000000000000000030f0c03422945d13d197ea02436deb80b867f6b546fbb6baf4f8b23390381650a2ad839623a1c39e5b12d5591fc2849393861d6b3c5544872ac675c25a7a4d6c94bf77e74de1ae24aa7616d2c3796e2532b73aed76e76ddbe20a8884e11164e7,
+
+R = 026fe4e1fba0595422479d2b2b48cd38205b7aa7efc293b7cfdf93a858e6d0cd32,
+X = 03ff70e1fe57cc7e3441aa0795b99297b559f71b7921e163601c477329f7fe68e1,
+U = 022e454696ab9e0d192442afa5a0f86fa04ba274a5c51880dc05e07acb008d3c09,
+E = d56f0586b3d695aa031b493eed1f55401efdb91a87e59e18d46cfd0676259031,
+S1 = 00000000000000000000000000000000000000000000000000000000000000006573265bc235466b469b1bd70b37af5a8604618e80e411b640f846b9ec8ef19e3449b341f27ca13749b2b59d275d3ac28903112c54e24d828d59cbe36788874235dc087dedf9f5632492e6e2560b2aad766db1580e1b18b4a91e5c4d8773b4d3,
+
diff --git a/testVectors/bit_commitment/muladd_commit.json b/testVectors/bit_commitment/muladd_commit.json
new file mode 100644
index 0000000..f5b150a
--- /dev/null
+++ b/testVectors/bit_commitment/muladd_commit.json
@@ -0,0 +1,222 @@
+[
+  {
+    "TEST": 0,
+    "X": "5f9308254d32aadb573c473353c5528943a743aa783fb16aa5c7ddbe682e3808",
+    "Y": "16812435d861586c37ae05cbcb3bf0b4371edeea9a9c4dad69d6418a01a6f6fe",
+    "C1": "183a5f00e6ea0d9fcf5c953e3b52fae8f55066ffb37e5684aff46221720b04b576533344396ec4adba86442d1383718456088e476896e7c28cfe14144872ff5a10d54a73fd060a55d9d868bd7a567a947dbef349262015a3382a597b8aed3668a67cc2b1b5cd00595b5d7e5cf3bcdf48eb8ada88370ec2a5f2e60d7ac5bce2baa3cf2d74e636798fec94a5f17ec25fc9fd455fa986afa3cb1e9a9efe4bb890d5d7c81bf0ae629694f6249b9d925f85c305fead01432a9d4c562f2a4614a3f316bea747fb2378376c083f7e2a11fd9579b72b02db0602ec1173d32f77cd4b751e26188ba46a6fc8237ffda651f7d97a075 [...]
+    "N": "d43e4221edf83f65264e5e99f6f4813db36c78c0583e7f75f85529284d6cb5988fe9a7a7035861eb79773b5ac35241f9745cd4f4afd5371bf2415321afe547c99179fbc090a10a32c79b3775dc95d3b9b1d8c2f008a7c0dc71ced861e4042f443acee53699c84319885216f2138da9a22b84133a10ff9800ea1753c18a0a3b6e7f5f7754fff9f32d434326b2685af3c72f09c09d7bcd9ba23681ae9dfd51766de45a3c7e5ee248c6bd9883483a93be36f170e6283280ea8acd1266ea790a146bae5e9984e2031415f8e4c8a450f962d0d6ea6eab63f2280234698c005bd370d7eadafebe902133a2a80dbf5ea07404f034 [...]
+    "H1": "1e735bb69b8fd73bcdb8a6ea4f17b805f8f2de6cf19183c6c111a96b266865ee9f44ce0e7857fe44005a440cb5d5694d31dd1d82fe90e75f487c9072b3a50928dbaef437bf1499b8ad3e5dc177d247a288bb4d9b613a74ac310b9ca3306a9ecbecc3bf8de30a105070e6d514fb54c9a387fe4b05d6a47dc308b7696cc6bcb4e9bc1f92ee04406bab610fcd47842dd3b4645e72ee52a8f2b67b3c42ef0815338fd90af14774f3eadd31d5842e872c2872ce73cf99ecd7ec3b3e589a61eb9dcec4d83d56f39198de2ffc739e3aee275a88f5e2014ff9953fd0822fb8eeeed8f561b7156f8d80ad9de3f4e9fd4d1f66a4955 [...]
+    "H2": "0aeaca912c3163b88aadfb5cfc1271239d9bb3715bff30055ab67abd32985a4e0cfe54a1df000d5b5411ecf7d814d24d2aaca8f4d2c69434674e21bf7135655cab528945a13bb84c42f49b82409e5c24956dc7493c3e500662aa1fa871bca1cf67e1451a558e4155362f53824c6525dc39baa280562b9a73f351dc0b1346c840de4ff1e59551f65ca92c2235c58736d42c67f8987f7bbe12dae2a44c3dea41d1d5ef1cb78f1d5e47deea1d6ed06e9aa3b008256390d6e61e77d80d728359a0ccc588eeba4159d6ec60c2fc3ffad1cc4540f7034d24dc4383ea5e26950612cd1019c6cb1ede4c92be4e5b3066ea61e3a0e [...]
+    "NT": "b5eed17dc8d2b334110128bd1b19e58d97c3286e2505283a9f8d060527e8aa76b08771ca8b16ac020b4e022f85f70422abe7ea8f78a0e066188a2ca022a01af3ab93b7c39ba2558425664ae00a3ac13540b9e73ffd44973fd0ed9030850d242cdbd7c8825ef164eb04de336f3e9565b3b9fedefcf5269f54c68d5d2751bd77142f2ddbe3eda0fb68f2397899515057729b7ef88e7c8a459f88b39c33592cd2d95461185522c90c4d8b0feed1c9d4e1d68b7eff16d0439b2a687b24b242521ef3af8ed11151e3b8d50bddf39d90d0d34ba6a13ddec9b0b1cea034ac6c87d9e550335b8e8268094770d137d022d51122dba [...]
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000007ef7f4c16d95a16b92aa8b682f75a8399fd1e019725168c72afabb74299c84adefc342dbe24da8d07686dcb70cccaed25238026a95bc070017f89fe6f0dd170b4ce7058631aa5363656e150fb5c86990bf617c51c4a0c5f0128ced91e0ef71e3",
+    "BETA": "ae5770e961a4ca88a57e94bc567a016b6e9f9ef0b5a48d69ccf9f3c67837101869ee8a341b1ebee667760a5e6ca1c1069b12e5b4fc47622e113d128903ccff8d21e950f6ba93f9900f7199094db703db87a6d13128521d6fd44922a7a8712da1e04e66fa219665ced8dc086b731e6b86427b6ca4265ffb8b3ffa331d18d0166f929e9cda956b8feacc14957508a9375cd66657c74919c9a5ee5fa07b9ddeab68f56eaa9a5968eb76bd2a67c3fefd3325477d7a66feb7384e5b26502b33883b59bdde891114a2fde4ea51888bc00f34e993c068ecb06b7918098a1f187c9ff860bf1e001bf9cb106b68d65eb220e706c [...]
+    "GAMMA": "b331bf40bd06512465ed78511cb96266a25009a0d6241847825ea9d08b24a0f84c9d1b02da730ebece01f31f1b6f40e9082b6acc99d9b56dd31d36776939f6fd34592c1ad807f4f65bc4241df289838e99ec30ef98a0d292d07adc6adc98ba5fe0e9258f3f0ce8f78f0a10406e2958ee53a7b3f61bf4eb17eb598befb5a7afc5ff7c3bd93b2f31d0e86acbcaeacf21f2c94fac7ac1de02dcf132962a35496f052bbae11b8482afffb4372a056599d427e7c91d7e207e002939ccc85a4181979892a61ef887cca5c2a798a840e311625b261465f390cf5501c5282e12ac5d7beb0a0f2c4df7616ce7bac4fc56e33ddc [...]
+    "RHO": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088ff94fd7a787d062a218eade734687511ee2d0ec1247f9d15f3d693b65e0b4c25385267ab507c8ec24c068948151cf1470d98782f90feb7d40d4a320c839ced1ed83aa18c07083fd3aa93c52f2668c801176523f3d68f075ee8e4ee0fc2cd87ab5f791b8fb2fc6856b247c87101d392ea21d1bc10901b6db73ebfeccf655b1cd0af8c64243823e1146b77f96c897ff2 [...]
+    "RHO1": "000000000000000000000000000000000000000000000000000000000000000096d80b7fba80da1885faa1fcfb9145f192ad57b1788aacf9884c2c5afd3b48f67f9a8446d35d59b6a28b8f2aa10e7c999d4f69ec4f728522633c61637d4a2bd760e72bc512052e430f4f152b6fdfd010e66fafbe0f24533d153caaadf0f50dcae3521d78c41ecf12ab0a45e43957bd4dfddb3ef01740a9f140c43f7d0eab79c89184f6b0f1578e1c08fc69de5342dec707bf4e2118478cadeb5ded60cfbb4aa152d371a2673eba18683bdc4abee19293a501ba53f790e63a1be4c608b38caddf908b8d94276e5818057f47aae338930 [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9d348be7bf2ef19edc53f42e6b086b02d71d176441883e5f9774a17bd6dd534b5f8de48a30732e48d1af94f3e3ae0ad57f318ac7d22df8391df812e8a1fafda7d9b4775c921c0e52ea8993af9b7ee6575200dec83b0330e1927bc1ba7b235732655010af824ca491a56a4c3c6386373ab98c76de9d277e44b620bd754c636bd9f66131a6c5d7d2374855aa80c4b3 [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6642d2ba4dd2527f837daef9458d423c200888fe458e7c2baf9d147d8426fbf8cdc94821b228fb99aa849361527e0e7d6d0962c6f01625e2621895c942133fa84a1d4237f2500924974f3b2464cabc36dff0b0905be46d42416553957a6ddf25224f41b206e04f05286caec182f5afcf4541358eee3d772ca2d52995ebc81249b2c56014187530456ff36634459f72 [...]
+    "Z": "21ca08de0a495e808283f324c93831fa9bc9d9fee55986bd98ab7c1ddeea15bf9adbda7a0f9d68c0dcdc6b73c5823ecdedb1b497727402e27bd55a57e3f70b3680af0b4f71f256f4a006f693056957ccabb9bdae8b30d831ead0549e471a311135861beed14e8a1f2c86153b82266d4e067f0883299339ba431bbdbfa7cb062498cbd4e7b9f5d72271cbfd8866c657d75d2a7d29ca6930746d7234b11dbf8ce507941fe55bbeb64580d8814593b6dbd0743dea3cb3e1269410a2be56709cc8846323078f1b3de4a7179c7cd549db940a4494d9f15438890262458715feb4fd8b21be659b85a0886a1407aa168b16900f0f [...]
+    "Z1": "81365829712348abcde8cb118871f9488bf7368a1a89287176e3d5a587215ac310027ecb4bf3af907ca1f4ab95d5b3636df5a3e41d7be4914cf4bd73c47e04ff4a4d05add22e5c80da9803c92a2ec54df5cc958168e9da9b9d99b5f7beb4bfd9dfc948c897e663beb95fdcb6865c81fa2c60555fba3710c2545e84b670f39cb622025c5fe24380dd03fdba46cc5cd6c9de907d8ee32e555bf5098c32c7731784a131f73427b8f01d5ef8329232bd52b28e435159c9508d19e0ff2d768b8524e07dc848acbae13ce3eac9ccc4240ff86173af29485b47a29cae5374fc0230ca06cc0d22b9b0129a541e408802517779b49 [...]
+    "T": "07030ce5bc4d46d923bdb7e5f7045f09911563b520b51b173718c78453dc2a28b3ec3408d13457be2e332d6e4c85c8f0e9e5f47dc8027072ae45f83cc58f45a1f3a9a28b6d8ccefd8c0256fa0fd9194e8a1c8cdee3999ee6ad6a445ef990c4ac8ecbea3eb6eb6eb0ea70b0f221879c0fc036e8365461c7294157b10e147666585bf606a209a12008e58eb89e01075780d481c5e9cf77168f490ed58b4974bd58c7716d5cadcbf66392aa98e0e527738341ca7a2efb5d20b28354a19c85622994976abbf7143c3d853eec590d5f4688bd468d14d3eb13fca30ccff9a93ca11229720782e7e4f2e36c4198c2045b2377508c [...]
+    "V": "4214c7bd84e983e59c1c7e4e1f8ff6cee3bcf7a0b4950afc1d14887d4a173a5f92eeea2e28a5c0123711f0c7250db344967d521cfe28fdf875a578ceba696f50100c00ade02ccd7f4b7aabfa5e181999f7afe9377f527e7d051c81e63a2f66fc11f4852554dc7368d6e897a814cee2d085971395c593ab0d5bf156e05e4193173e0e47b8ee5974c9c6bb1dd703cdfd15ca2a545b93a28beffde418e155c0327580be76aca27b6b86a6a27c481502f49fa7e3d29d32033e1b2721dd5ba8c887d878088a48d4ed8a3cc97a10bcb6973074784f202658e68ebcb44bebfd7950b17212b7dc5237421bb753219eb3a59d5cd81c [...]
+    "W": "5840782a0ed9bd3bfc937a60ce96a4e8ac2c6fc46e212082b78fd773a7701bf7023e6eb84ec8dc2f4775f940efe84a8bdabd94ab493caac89826af257d68f1c14da6fe58a71e43a3ca553aa189a8803567dbd6484eba813ead4d687c69f65bec4be995757bd7ab5ce84dd3ab1bde8b76236a4170e0d8b6120343277940dd6630bc5b4286dafb7586ec51562787c3604fea7c4903fab9254c02a2f5dedaa02c840bd2a5cfd6d56a93c5a9ccdb92a27c28588372c0304a03c8c39556fc5d90dd8052ae8db2dc9c18c3479ee169514dd20d51c912591e2c6b344f57e1aa0239363a4092423ebe16282a8276c21e2a8a859db7 [...]
+  },
+  {
+    "TEST": 1,
+    "X": "fbd1e5436ca13df885a7e68cc7253cc15df9735a80207d37f548525b2c3be338",
+    "Y": "97df40188b8468f743ed5c69f39c0e207926aeed0dd0a28aa8d23c687fc268dc",
+    "C1": "661a0bd0456f5070639013456c40f0e641bee8f7d6a85370cdb7c7930538152de2302e9ae9099d10461cf3e4f2a59a47e089fc21fdc61f207cb602cf8772edc21f3c2b4ac0a97708b3f74346ab8d8ccfb4e4c63f48a436f3c1b11990e3b4b78e96b37145ad99c0e63ff4281debdf385179ddd4f1efae4d603a1653afacb7a9ad0670620a484965334eae133392da5fe527c519b07f275fda50e94eb57312f2d54d3a539009224aa1c4c54cd2b89102e90bd96102a9c09d08f1960507a067a2eb1d5e8adddf7cd466c47c79573de81a362fe12911b1d76643e554bf84a4dfdb49af30a9a10991da159b9c8f2688ff2ce6c [...]
+    "N": "c9d099d16c297ace1b005ec4a1e4179a08b73d3092f153f0624fc9dad82c9a7f0aa57f7151c65ee250871e0ccb197333003100865092de56997c3e3bc76cf4f0dbe56e4f9b2fc45bb886362ab5e84974da18f2cf3530396b71a56a340449d3c1b8204cc1724af95f1199e3b2e8fb4a9f2e36be61ce8262de036d2fd9e6a6cc09cd03392a634eaefa27d90ddb8d703962559388ec130050d107c22bfc18db1f5a6f22742ae9d2a7a8a42f60fcdb8b17556ad0158201263b341787a871ab66fdd19b14f895352f6d2ddda4b465cf45e52dc567533c903a80adf6799c27cac3a0f9ace099eb8cd9c0e141fde11876f03318c6 [...]
+    "H1": "9ddc4965e3afa1b2531b29b8f46d667da6a4d03544305fee194788ff1955db88a14cef4da60084060dd5a7f0d05a8d5ad937c118e9b3d30004738eee6410e622b49fc0b1a2f818e8186afb337129817573442cc1bc6b8fe60140359e4a468ddea64abb9058236a0633e7eb72cbe25ee83d5033f5784372ae519aa6717c38edbfe1b3f1480ab4d06e8e6395eaf0ff5566857ffb2f1be8765140d6e1586e215030fa3f54b87aff0490b6e95495c4170ed5fa1358720e5946c6d0b1dcff399cecd335db1f50c26075beb8f92b66c0f467b144e18290564e00e7ce6d346d0789434ab8bd86821d1a231b1e38240e18db659a4 [...]
+    "H2": "71e4408aa28a6e6604495a1b2c5a1c2509192d86a6af56904fe4fcb50b69152377411ba595845eb437742c625650e25a9b53227b469c52c121b795c1c1e18ba05afa59435a6938a320f8bf5c625dd73a5671800250072451fba8d09f0d98879bf621ed9fc2ee2c67a02e7bd3acc9e1db54e589d2eb012910db1c0b8936300d3c81a2d26a4b5a4f4d2ef15a5ea31ce57a9fef67b488e1b919024f07e9910aeb31aa9cc1898a6d16e310ff235adef38b3f0b768bddf522a108f615f0aa08f64c14c8bca78c97ac0937601d31739ed20cabf2ed3ce78a632b80b0b12ec30c0bcc4c75399f2bfac301018b44ce889c2c80944 [...]
+    "NT": "c1b8aab9caaf1f9021fcd135ef022089792684e7cdb1467ff522e46713609e7ebb633f19ad52e597f7dbdb59f6684f204f368b7104116a1fd8eabdc9ef7eb4b64867ad1f007f74bc57f2fb77b0b9b518af7df355e7a5d99217df442358543b76a51798e8ef194437fb4b58378943cc812942805a0b3d30eccae13fb56ea3500a781549d1d6fbd0b2ac57d63aedaa05987298201d8434b6e51b3c0e75bbd7eeb3cfbd4f79d28692110738954720784d269fabf4d4280d61e4fb8581803dd75e1be888d29d8ca419b68ea9850919c0d5563104c084f9fe0730b496b70612aa131b20b951ea8eb61c30b186a684698f22bf0 [...]
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000002c919791629cf6cf8168f163f8efa13f91ea6e660313729bcb4dc3b839e8f509306ff499b8bf6cb2433d107aeab8a088aa4e4a6f49885fe430cfc4daace6c0d542039cdbc98572a844157f7fadf09ad2c576a5bea9a80d0b886ce5fbe80efd54",
+    "BETA": "c5753de187f5a2b929afb3df6230f4e70d7492ecd8c700f1ae51aec6dee1fd85915f68d21334e5fd57dd67571e27a42f6b83c431ffa702538293f744a552ecd04b0ec3c524d2d82758756b1b44819634a615d7949a5dc59a358456865108bcf046c205d85402252b20acac9b03e5f28ff95773c3c9ac103e8f60ae46adbbc28138cd0545d52ddf71006573784c2a2d33fcac82defb6acec680edeff93d06daa32e33e7eaf03b2c13890ed3d09d7a54bc6d83bb4a6e81bd21626ca82142f6738f74b98ed6a8a18c3580dfd8100f2ed2376f3cf1e9451d677a2dbfb3940f9ac271d3a427a1da451e5e3bbf39175e4ee22 [...]
+    "GAMMA": "94b091c4daa021e3ad5683dd9b25b13bc7fbadcb0f6b275daaa943f0afa76baa55658060c39e86427efc56b79f6f47bb6ab68b6bbdfce9cf5e125c2ef00e4c3f687257557093d293c90dd39aab32270b5ee77a052a1e690e5b8018922b7db6235a56b15dba7ae3ad57afe9ecb32ae045103ab50a6c9a5f7fdae9fe5b835ff732bcfd59190bf5da3c9c5a864574396af8c7b3317c530bf4a3978680c7fdebecdcbd07dbfba5dc980b55f1455f21fdd2a0b0abba680ac4d77e5cf125078d4558d21068d22f87a0e475f5889086842188bb27257b27e776858361ce2885d1d2e2986daffdb5efca7fa6426f96f17d2d10 [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aaac8eca4561f4c5ff3f2c80e823cb8641d32e67037b01a6a1bed6f424ab9edb20d73e632e30fa3eca02ecad48ce0a580e4138a8fae0db855afb0815214e302c34791d9cd27357cb80a0d5c01387595dcef2353f46793d72bc43580878c5e9db8d2ae059d09db5169c0b399f1cf5b17667dde4519ec4398f90f93d1b688e046a56f6a050cf32f99ee2669ce500c0e03 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000000a490a7a2944db47f0854df23e46b04bcb03fc2406f8c358815f1a12add4a21963c5e32837085d44f68da44af2ec27797d76915668400fb321be5a65b389ea238ae3b3b59d47e3b8357f6fd9f8171520d04387c31f533e3e728397e60ace96b253d8e2788adba0fa991427a9572481525eb628a28c91fa14ac9cce433e6000fb0b3a0b2a4ba94f7b164f2badb553b4e10b24cd30bd2920a93ccd2bceb0e4b690761db0e1bf5f70c3087a3133c5b0a16bc26bcdbe10befd4c3093cdb569d2aaf3857b38dc94bccaff8a18273e1d64e0d [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b5d141bb2d2cf714de96a41ff536ee13609ecca5f4fb589989e5a4413df0161f6b8749ea296c259c348f1841fa7ad4392a1654eb69974dae235920056339c634f66a1c8ba1d6256e38e7713f866455fc22e3999b8bf6b0dabbb695aa99c5ea0f9fc667b09b42e31ae6e4bf7422c415227eb646b76ee88f0e8cec1faabaa254e86cf509f073017338a18029ba3258a [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744d445814322bdeb28b1fcc9cec0daf2349cb3657490e2dfda03eee7f6c1342835577e116031f9cb064861cd7b7c5a4d9499aa3512ae43216b2f8ccff4a2babd1bb1925992c34500cff30318ca6722d4dbd3b65f9979103250319a28c1dfb11d69a4513966c4f1ad2b692474067bef2622e5d37a059cff1451c43432b3516327f83ca3e644e011dd7cc78acd494282a [...]
+    "Z": "4d8e0716665aa7a6b33a2848bda0a954954caa22c632cebb2b51017612398d03bd90396f0c5ca26148b97a09911fb2833fc3eb4771c7b42b6b817df4a04db3f93450b09663315ee28a29954e65258db15cf9000870f0c1982d98cbdf5c11cc806d0357fb047638a039e59f649584c6be9127544e272ccebcb1e837cf90993b4046f5df0f56658b9a5fe0d3ff2cde9a00b1b98f464e28b69639d385376debd0b7c2befd75eebdee9bb64993fe029e6c23d789c97b84b35aae3dd5df25bc85699bca9501e1cec1c564d328617b22d22c7ecfbcaf719aa68e4f7ba978e2e350da565b5538870824e880a8a905de12a05a3389 [...]
+    "Z1": "08b1c344f0599890d10d229a10084a3ac048bd7b5273c8591b7b1ed72719d1ccf6172e780370c48ce76ac1f1a0242b93fb57f09df06d4be0208be23730f831d0938a4fda656a955af76feba82763e9e7e1c982990079f5584538bffecb4a6670ff7d1e84e4ef74cb9792801f9e16cd2a6c374770ca61ee396fa9828eecdf73b1141cd9f2eb3cefedf871082e91ff88f7b5887e29c798afd0ce1fa7f84d2cecd9997e9c009a8c18e2b361bb5e6814a3f5b3840e962c408cc0022f65580b62d6828486d22db7ea6dee31381e19d0214fad591ff3a084112ace1533de4892bff6a4641633e226a06f85ff9f4edf9b3a2d4d3 [...]
+    "T": "184c2af99f9371d2de7e29974a02016c5eee3c965e225ec3ff7cdb7008e93105cf1eb3b1338e2c58d43282777f13880b0fe0f52aa350b53ef867310780ba6809611e70b883e9160e7581747a0bfb0f2fe7b9cafc02050c4b49e46ba4edc1c75e9a3b78a314f47475d0ef9c0a6d140b4eb567a0e9ed22eef7435a9d91f5ab50d987ef77ecc3a02b2d28de648632344727bce142e1b91614e48c58fdd9a5f097cad11511b38bfc789480ffd2ebd53d33c0f27a2c16001921847a3c02caec07a52809f4c54ea1df2bad1ce824682ae398feaac35a03850dd77643593d52036fa069fdc711a2a9470741ccd0ba62c0bec27d9e [...]
+    "V": "3d89c6e87b84e69d3979f4177fa3177a4958e52a52f1811faa1845bc5ec4264e085ba5799eeac897b6ad56c5f04365d1f56932c6aa4f45a87f3035ca99849e424e24d8a076c9edef0629af056a66a8b8836b8821aa8397c92e60c55069acae85cb13aa424929cc5081d369dcbe3024c409c6edd56561159be1f02626c68af63c12b3d8c51019166233fce605cfd593adc98015d13d8d33156dcce36a2b280c6af7c488e54cca8ffde5cf4fb3a23264b195322360b303166ce3500753788e03b701dcd8c973459c31ce5b3100fe28f14b967fef7d43ddffee9f158b1da851c8e61ccf1f66504b8d3606ba96fe10be7d8ee3 [...]
+    "W": "2e84c62a21c40a5087dc87b35328d6ffc498ae64ce39eb8b95241069be3a50c58610f63fa4fe0c8c0308f8f4ea53e5b20bfa13897ce54e88760f6db621979df56983cbac078804331f05f327acf3150facb1534d7c55d04444eec00e04d59cb94656ab343e18a71d1ea56933031a6141814d20227980f1f9833f70bd9c73e0c5be30b2cad1ff320f33eb400b1117154ec043257dd7055df2c40803d39a5cab1f2157662e9e1206c0842005cd16995a2e248aeaddd36c7a9346b2e854a914c147017b1c99011114fd78873317091792abe2bcc93a8a8f2e2b28ee78861eec8e3c6e68a82cde69445003e799dff070240b85 [...]
+  },
+  {
+    "TEST": 2,
+    "X": "28b555904421644ee5f8364fe647a7d9e4b58815b69925cf1df774c735b36012",
+    "Y": "90f78545c8cdae324275b7c37f33e83a076cd7939761d4e68c9dfaa20100a587",
+    "C1": "027000b2802e324b7101a618288006587d17734ac5394163825343f74112439b95d555962c06ab5c69e0396a5cf1836e80525224ad22d20b42f2e7eea813b15b04e8bad300cb923e178627e596d7eec206e19f50c32f79b29fa37b11663da7ca00c78d1f7d80c3cf69b115afd0224cb08e3ef4674b304bba0423b7625d0b0fccaeaf2e92ce424764d99ba0f70e8d314bee78329b2b4598b498ab46f5d2a8edbb122f5739d07cab4acc90a50261a05f0dfecdbdbb3e4581d24b79e4b104ab32a5d51ddb0109342e8bf9285b5270a23ee47fd3dc8add0e9e63a29bf10eb4bbdae6faecc6a2be9172dfd269d2e38a5833e06 [...]
+    "N": "aa44996981ac935691b0a11d0cbaba5fa268e1bacb851027cf21456ef68c96ed8ad0d0424c73a729a27f7a8c083f3bc33d54c4d96b24bad82f4e58988db2ef07bf233dcd44e7da812c98b94e79694fa80eaa7efec909dbe40ac96a5b6ed45c15b15b48f2cdd5d7560faae3950df5b22133070082dbbf4cddf97ba0b8c2dad5f4ee5a713aa04b2a06aae3374d6b570ea640164f14c5fd653f212760f1befeeb6ec6a13a734c7014d6d273347cc2b451d5226042ba7b66885875c432f98f4c52b4dec5c2ba03c647f6466d633da8f1719539bf120807c596cb146243a82fc1ce6454931d1f54a651cd4eee8340ee9894d8c5 [...]
+    "H1": "6f2f5ab0585980fb3fcba5e889f728c30f31d12cb96debbb465e122d3f2bc61611e4025cdee5411ed8c93221992cfae22cd707babc00e4f5f328749612bf56ea97d0fde9aeb914523f08f997929992296d6d1add36f3c65749bb1dd46069b9f50bf355a68b06b99a8785c641dc197be71720cbb8f86dce4fc9382ff3c4b81fdc55c9b42bb764abaece60c763aaff7285ee6776b3c8a7686461b183360e8ee4d6be69ddb2f5b8c5ecca95b57fe79d6fc36e28fa48a023fe922030ad2f6357eeeb2ea9a83e77222dca137790c614d54be0a40ae9152becb0b00e995302eb7aa98d940a7d5945471ae25e760c2df3ad6ed67 [...]
+    "H2": "d1c4e80f01fbb3c1febc0d7985aa6924c862867a57bf482a04ab7c9d7f74800ef03ed7833df45f0541cac623daf12f81133e65ec981af6a5a6f95a995ce945e3183ed5dad4b5361832c18df825b5d249b37df12ec8ec4d67285dd1e5e623fce6dfbd2236f908c70114aa2678f025a97dbdc0152d6dc32f34219bc596c27270ddc72be675d2421839192ef39074809967bb54c0d32123e8205f48864a0197a51e305b10d3b26915f561f710b97937ce3a8b7ad57415ec5b59a952db7dd0a1784a5745a8da39ea35c748e0cb41bd9efa184658a947ca3404aaa4c0a799a25b56a3a3ba69249532345ff43bc36b394a534cd [...]
+    "NT": "dfbdfc2a4784522a0bcd93a9925e2d185ec9af22e3c76af9e3a55552ef2d22e01c3a9e5155420383305ae63787a6451f91d2ee741c24a695272fa1f3b7ed6830d7c9f519fe3afefd97b956029c9bb781ea3efe49bc9cfd911dd132f7b1c12d9002fe73782c148b299144b664200246b3a5336b46768afe63e8b508efb0aeb71022e27307663d1ff104865310e59edeb9220630561530a7de5e3c5a74abaa4549b80d37e851c8affc44eb1024387c63a7854346ba6cf9c9305d04350b93db8cde33c3260789feff3b3c4d55cd50216e4473db4fd83d138e6bf25a9d609f010769895dd1844fdaed0cca3a773ecb734a668 [...]
+    "ALPHA": "000000000000000000000000000000000000000000000000000000000000000016ccdb75210f4b16b9b96aafef37167634345fd6c608bb4c90732c054827df41b940641098ee354e6ab1d123d3a8a645e3843387087278b56122f4d5e42523b4724f00f8068bbe0e781a5c6ae0e2301ed4a20756e0b4449f67912df318315c33",
+    "BETA": "5f01bbf6a170296842db2465dabd1401f6cc4db22f60d0e7fb13d998af73b424377d43bd99b3da0e7f051e3bc99fc1517890051a127027dac429bcaeb28bf20fd446a116ef266018ad53fa897f0f3f13b329dfb4b9d5673c4619a20178b725515f21b84080583e7de9e37c70ad58104ef31be0290eb60dd41b52b9eabaf8f16d81106c7fb7674ec8f7bfc93993b1d65569d1353a851c8ff125f88789cc766b413dc7e60429db09bdd64493cc1a669d60f24ea2197312172e045330b7d0b1cb1db20ad1da1880a82fb1a854810fab4514c8d2d2afd3db458dddbd1d02385c70d9a77dc4f60b090403070b548f76177ec [...]
+    "GAMMA": "1cca57259f2a0097cef2cf0aae9c73eb2a451879e6add80cb71f0d36cc2076d054232d5c3cfeae16ab061700dc6d2579e6436d9edced93bcdacae6d6f39d4f2e5a9107857fbfbc3aebe92ac01ca255d50428f994a903a6e13e22b8b3463504bf914d0e04ea7fd04bfe5448b4c363aa617e54905a195c797c7773325a6579cf1c498bfaa8443d5c7e0568d3024b1628c493cc36d187e442d73b036a0bf9da6a45c2797485802889c3531fa4edf2b80e72bafd4511c0c57577f82a543f7f949b7bd72d090c4312904eb4aa53e8a13614cf34544cad36c7f24ac7df7715527e1c9a97ceaed8625f1a17bc65cfba21bf0f [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a159462814ef1416419ffcfe107780677d4cba64085f276388133d2b391eace1076e4515cdd1698dadc5ae29f6581f336bf399e64f56dc0cd5385dadb48335d7f8e017ba1dbda780487519f794fa4c6fe8760eda3f54b3474b887d58ebc001cbb142c63c1e8bc9aa5a5a508b060fe2f8c93677197c166120c5d3b8b4e2ceb1406b55f731b11f09723124bbff5fccab5 [...]
+    "RHO1": "0000000000000000000000000000000000000000000000000000000000000000a274e6e5a3b564e9e217bed03ceee3898e9772f7506f79cae15343149e620952abb4e62b7a957160892f3f8ae67682e8de556ddac85b242761357c444126d7f5fb6147cf8636a66944f03f48cbc8898f8abe2dfe4572ff22acacd81d164278b654d28ab72208bf07ac6b268fe143ee0f59d8abdf18a04e7c1e50b1b8a8b2ed4dbcef9dcec179e0147fc9dda231110a041f142844ed37ef979be5cca80a7fb279e18399950e0d3b5b3c959a6080b5e1e361438b7bebcac9f8d26f722f2d21a4191031bbc6e2ae87a54226396a8bf6b21 [...]
+    "SIGMA": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038e3a58fc7654ba2f1e3b60c9c4fbc66b2266b48f12897c518f7237b1eea551630d283dbd93bdba08833015cd2c014624fa2f44bff6b8424e00faccc44cf6f0aebdcdea28350c3c13455da96188f95a431556c2663e4e1171ecb304b3758bc6b2a980ece1442a39567221e843552058be5c8dfe3e110297ae7fc54bf64284dee595da1727b98b875047554813d62bc [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ef7f3900e15cfde6c3ffb6b45e9b933f5c17be4892f3020c1ac824bd481606df8c6bf067405a07037d23ca20ac0aa77d9d32e39121ccaa64521db43e6be56bd601da537cfece651772b2ffa7b93140d0caa21bdaee539e65bd79864a71649fd8bbb99366966a21d0733988c3fc462c1df153839028c8ffa9683f4632367aa2887dc5501dc6754bb863e7d405f175af [...]
+    "Z": "8f0e63657977ab477447665ba3ce4b5981a5181896496c594f5c154cf2b875e0a8da821096159229d1378d93c43bb47d38690f0bbf2fc715daf568a0b1a20945c14d1ee045bd85a42e91b70312f88c5b8eaeb613c6978d26b2fc4b9783489d95089ad9e1bc6e5c554b1f06bdbc464f0bad77f4a6a4aa183546c34e4b942020a486810236d82394ee05376abc5bda222e54bdd6ef7081629b45aa7c5e8a7248ef1103d9a081f2d65c339f38adddadd2df9993cf52004922602b64d5eb5a73e777fca6e1cfc4dbde4846068a935c5ed7dd8c30cb8876ef9eea7d076b80689e9f6cf33441e9c9c0e1aa960a8bf238136e1486 [...]
+    "Z1": "44981dc6bae7851273ab0732085f8dda7ff4560ddd07ee96b8c95982668f582bef057c56b6b7c29992f2e7de15b96bf3a45e362eb5ca8be23444c6edc6f062198536d37fa8b9af897eba083a41b6b103820e1768782c9f67903f5f55857534e36de0516dd80aae41ff1c51b21d024314c2d0d991b59235e5afcb31a283621df6befc8d3c15b85c764bfa5032640c84a4e1d456bd57732010fdc9ce7686159757594092adb942941ddb06783f837aa181398ca32823bea8bddb595b3b9ae6e43b8a138d813ffe57cf20f0abe5499f0eb27bf0134572e656dd8ec71f90550f5f0174379c1e77565d6b77593e08455242035 [...]
+    "T": "91850989c37c500887cdf1e68c9e976f6f0f5b1a3fc7b02992e594a1395eeae8b371c4e301abb89a9c707fdd6b979c421a6c82c81ebcbea50a37be7a975dca0af8c643a0242fad8cac1c14c14132f3f309589d426b5397050f2557b2ccb2ab09c8832a576dd12153186fe029360825e1b12b4cb7aaa6ee26a6c46ca5e982eb150bc20a1472373f28dea9ebd631e040dc776d31429a07f075220da81382451ad3dccb781ca1fde97b41f24484d59d5d37a908979f5063e244f4f1c89e41bfbb15be92b8652057586922c58981f39d2f80c917df710a365341a48c5cc53becf8c3a179e627313bfe4aa732a1704eca5449ba [...]
+    "V": "0d4f43b94b5428ba003b07e47b2cac7c205ad706f16edf67855d26169193e9a0ea4d2192b9d1070fbaba227c3e4898725d5df9f67f6ab1dab155c3cfd996e50dba84b4e1adc2a8b2b7d59d003d629deb8038652f4a8f3b26357a1a02e1b05438a04ead43454085f027cd9de8c26dd153f1e3f816a8fd91a2fb1b7475763a95c663615815a485a21d61e5f4cb631ab2ca390ab3d55c9f2a2554b3b19ee439603160992600280e0e3a68532573d798dbd7598f6d449f9e57b407ec41e80e2af8d4ed258bca6880080b656143efebf80f39102034efd9278f871c0974ed3f81ac3a6756584f4f6b39d145c4a149a98d5a30b1 [...]
+    "W": "88d42e57f2c6dd443cbd2bc081a3c293193bd2c93cb5d869616f1ef989180c54bacf067178b38bcdee6606dbbc67f8ea5ae2b101802e063970ce0da07a1a7377b05661b09c5983bc14d9ac3ef9e6362cb0f5bced0caace4593a435b54602c6ec2d3b58f089102d9792eb9c13f95a663d66e86cc3cf8ed2d1fc598e0245109cf4666c78ea1e99b0b9b9a8f7c29c42d58e307996a428e1db4138db537e1db28ea9ec5436f9d3e6018c8334dd533bb9264428409500f74ac78c7fc56dba9a0444fb471c2baffb47368397d914a30f8435e70b463e53ab54cf102de1837bfadd9e81056b003ea43ec2b688ec22ccbb516e9c05 [...]
+  },
+  {
+    "TEST": 3,
+    "X": "d502b329663139b5778486e765cf5bb3fe03caa2bd84cb1d28cdc0555ad3588a",
+    "Y": "eeca2075d0109deb1b309462953508880378827db81d5153847d67b8de53ce02",
+    "C1": "3cf03a12596e4073f26ca9e812be22b18481292a79557f396829cf509697b44eeb5b087d2a8ede08f257d66ae438af6b3a487dd8789863fbb61b959be9fc8d20f510ef82fa42b9cbca0efcf68c4907e1bd6822efbb895d6b558dc706dc0bdeb05f21f3034980f57c3cecb5a0f0241022f9f86b9e4cc2c7cb5c0c575336d28b5f61c134bf5e931136e07c02dad46f1f786dec8979fa97b25b94153828eaadd6675fbc478f77fa9df82df3347319514e3f643baf4616a9dd0fd57eabd79910570b874474a0f7f5c0a59a54aafa285746cf2b6ec1a1e1dc41b7b9f392ef26d1336fe0d3fce54d6c1fbc325d3f4de35cda7c2 [...]
+    "N": "98e00c156e8fd8b1ce96aa2199bfda06427652c37d55d8c9a8b4b7cd25e1d446f010abc9115e972c334e24a924c6f16a49642c1328cf915531c7949f5a493cdeab66c144b34316d88488a44673767f65303753031835865739499a0ba92b5b6e83f342697bccc4da8115c8a95381d1bed11a895ceab3e7e43d29f76c406da28e5038ab6cd6939749afe2e2b3e06ce2229f644a5002c0e44197a6f9be06379c404c29239c6f030170a53ce13a9cba1457e4b2d1e931a1f4c1a40d97ce2888345351d0bf071f9879ec3db559df0ffc50c1d3e837dcb158297aa9620fb0600982a94dfbd0ab624014c435c2dee4009a6f2d5a [...]
+    "H1": "205c3cbff693616b8b72e378cc02b2f713584febcaad23b6a83ba74b1923d22e3b08dd3c3ac400a13aeb208f027dc906730292a675c73a02bc2b11cf46cd2b89c5c288b670b2bb29236fc4650322d7d94a1e882b0f07e014750fdb5ce7236b920922f1dbc8c6b175bcb8779e8e2b63dad216f610aaad32b4e03523275301126875988ee86ef6740fb29baab9a8d02e659e88b34e0c868d4577c5cb4ddef3ca1d319f3e3245fb522a6d7845c32a3935cd5b1954dd1db11d76f703b9f141fb8a7111ff0450b310ea6ce95f91f2426d08b6696cb111a38aeb38bf1818efbdc80032e06b44b56aabb959caaebc88992d5fa4c [...]
+    "H2": "071487dd30c991fe42c0a22f286cb78fa0745890a30dc010ce8fa440b0ed650395bd77fcf2b69d9b811be32ad0ac1ce4756f79ae75d8a2b3b25400dfac86a7907f07ffbd114776137d2f3889911c3ff63560826dd26a8f3a20803892b26a627c014e072c9ecae1d304b54cf6559216062c0ae0335647ae62fbf29acd7f6858d091dc8bdf10426c1384a5d0b87a780865f4ccfe7ea3486a31c4c2cb2efe0508e5c77210a656f2a1ac65ffe93abf8ddcffc1349813988b688429aa01d0c939d165b7441cb151c9bb9f9dc843e3d3f5c10b7ebcbd3df3d30fef288575cd094ae122f0b0a6d17b2942d9e045da66178ac775e [...]
+    "NT": "a86824e86c82674f33904dbdcb24e39d2464f3f906a90702ae2af8f71be38e87cb974493dbdfc40ec9477fde12be9f9c3d8ce49b31a9a55e8e7b56909b263106025cacbb8d454375f0078689f2c7df41e6c0a92a10aee5e53718ff1ed4ce08ac3eeef87d42e41e485f457720dd0173bea2d6aec0c6aa0046965e09c755244bf365c92f884dc2c38c415e041fda53b0226147ba3d8ded0b8d1cfb36f4aad7b98cf24f46dcbc6c83e9f40aa44d50c3c0cabc27d4c52a0c6e6fcc4736303bb65c5149a7a263a4524abdb512407a5a84267ee90412aef31d81251e20ed3735ce6f3ad0051138b21f58d95dc0bfa1b73b5b5ad [...]
+    "ALPHA": "000000000000000000000000000000000000000000000000000000000000000063bd86031ee2055d7a3790143591ded8a7e6abb29102df2bc8620b833eb0cc1fa89f8d8b65166d27891c153e6ff29a2bdd80a65547c594e26718ea696ccdd975edea76facf0cefbc18d4c3210a4bd51c0ad3a0d3ff8cee0fbe4ed411721790ef",
+    "BETA": "2da8a0a7d79262859db7580d172a21436afa664c6ca1a32adf3c877acb9cfee0d5e25aaf49a94f1078fad2343373ee61d8226cba00458d88abd687c6d86440d5673350bf79b251804f5d92f18a6956ef7648364738abf7770ee6fbd33905131c91c5f240d322bbcd0a49072587f8bddd3595c30f58e3a00134fab00895a8b6341b2f3935ffee824ad6cc40048277fa2b105e7aadf85a53b74a3f6d18ecb7b575ada015cefc39c5f5c625bcfd0e13d94161159f0149b195e85de14e71e1109361174b1df8ca2ef515e429caaad73aba803ae1701740469b83b96e732dc14271123dc872a59fd21c3b8a86cf3f994e053 [...]
+    "GAMMA": "030c769cacb240bb5f646794c30bcb79ce51f1c44695d555cd83f8dabb40de911df577d66764c007c9d341a9cf03ee182530f345fda5b7f94dd1a1d72dee6d74aa6d6c8207cd782a715439474e335d1012f7760e20e335e4ec0d95ba167e43709d70d94872565967ba03abb396ace02a722ec56fbdf1b2efe0680f96675bf60723c641d05f154eb623a2dec098edeef7852f97448085932eb96dbb74f3e9a9c2e49fae062ee0235566c2945023e785d516054bf69d3dc8b2e457d92793943413cd5c13ee0a3d3e459de3be001f366d805a95829427e6b9380473362a8d86c1077a372cc180acaa08374fd2e7c2f4bc [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000857d07980e64eb85b9b5291d059007df9225288e0af427267b111b195123f3caa6b6ab04688c2441e01eaf4e318a92025f63e99eaf0f327c24ea5ba2b66378a8e8e4a9e797f6c9b768f4395ee015c7064856fb81570fa133375154a809ad8cd528a0a8d92270cb314b9acb7464baa0c17033ab77b70a90153675ef69286ff36170910734385b5d79e95c36f432747797 [...]
+    "RHO1": "0000000000000000000000000000000000000000000000000000000000000000176af5d2d8aae842f5fc2401d65af7922125907dea312a045227aba0e759dbe52d454dfb09201fb64f625b9aa79956956ca280d974b8628c2ed41e2ca74131c22078931f9ec05e605e8fb0c75c47be9be1e17b17d340db8a3a6ced5695c4c2dd58be64b7a71809eb3409408352a10ded439cac5539132dc3e63080ffa715d5e7e09b67358d48ac2016941dc36ee74942ba6ca9a9cc3cd5d680992ac367320218f8d557a34ff643e95433e10a2452051fe83ddb90eed49a392025824405965dc671e39a56d747c08bb424200bc2243e7 [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f21fb81fd5bed0456ca32cd5bec86614ee0aca9ee323d7cda172827a30281ca1aafc41ef638eb0953de0af854db05b4f4be9cfdf54d492d2ac0f3bf7a55195e92359490f3f9d57274cd1728f5e27a08115c2b37231293f0125568113698f0a214243998f365e163992917c978fa40a63c3f7daf22d84d5e5b48a0cf8b2d50eb2d3a4545f6a5ed77999e5ee5d267d2 [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031053f7df28dd358c406152f4786536da13d33b0b0f74a570aff7879237abab80a79da277ac1664b95fe7c04886f8495922148720aa262c2a9d0dc722715dd8584606310719464462c5db802542675e8cb18c89f5b38a3c235342cb11f943ee1f8734e77f01ff6eb214158f0c04e0f11e5f0b2c751452acb79344495fff5297cc17b11c3e4a2e6ae193e30ce06acd5b4 [...]
+    "Z": "5fd1d1fcba2ef735a735500c0a1b38a98f654adf5bd52d3a9f8755b825079012ea7fab725a852e529311e332f12fc8030f079b67f56bfe288fe7e6d17c8ab440e334a1a8ed5bbf6277861bb9c1184701ffbd09d77392e9230d0100d5fb4d44843e23c0f765d9ffe852ac2155e2b12f409bacf0862dfc906e4b939dc7ae0c3ca376b3a80f29db69f14b4a2bbd4bbc48ec08d77d03241dac8f4bedce8d1c8d7499870ee2b9105020000886e84b9558de7eba711da87b278d3556866b6ed18143c13444d45fd3b32b016f49ba7395326774c59f38f25160d12ee84677912a14f45364dcff0e936b830076093eb14ded55aedd [...]
+    "Z1": "a1807ca0d7f739e13656e80aa2de07035cf73190c3f917cac13d4865a27a1034eafa9794886f44a02a58fbe2cd1c5f7a9a3e25298b4c11c3ccde46a3a53808a95bd0fb5e6fa8c2ca9a99ddfb114f1a0426069218bd384228b3cd4316538b18251a5e05207f1ba3f79d9f1401a99bb68aeaf06cf535ec4c3106bd9e18a10d8f736c8754d61ea5eef5cfaddba6baff234c22f89ee02c8c4c2b206f3bfa2c33e0110648a1ee9498b78179ab51c619101ef1d51dba4a68195199f2df86762e0da5d085bc55099f94feb837c76b046654aca28ffe523178fafbf4d767c9d017752fce8650e24ffd5cd4f17fc5e5bee2289c8da [...]
+    "T": "41455a67d865a2010cb7255f370a85e96670f75d0b9f6d4959bcb5ec4cbabc0d3769a4771f41a600ff2eb33c8c45e242b322c08c4ce48f96f3e12f4e8f546a0ede7bf64f709d0fc0c224fb6442c9597a6311348ae2d2268960dcee0cd5021c410dd1903f8a0fdeb626b92e1c635541fce04dd37495cbfee3964400e5676073a33909dd58d4c35d3db9c6abab91e06ad7843a07e693d3e661dc5838b4b36b3dbc27dc43d93767fbfa5fcfa0eb8f36a23e22372c8b787fea0c8a0a32e7f7a0efdc8cb09740a2f57e20d5b4301884e1c8bfebecf67ff3f39bd6f86efcf14327d02dc2f2f48f61bb7a35e136e230e77c83abe1 [...]
+    "V": "100dda7f67d0cf88e4c5636663e25cb3dbe42373d510b33a80d5ceec1d2a5db2fff5a57b9ac4764a62f8e42ab79b307633fdb8d278fca99d38ab50db7e78f43ca389f654602ee8b4a1c0fdcb96a0ab7d1c3a7b051227d082532a0ac5565f2dab5272966f33cae24fb86c1ab052637e2daa0aa64b6df0932e79f2ff42ed844d699bb58071e94f357a0e3ea4eab414e3168411eded6b43a46e35b11be80d586414010657ef80121fb2624c5478d4e5e44511adf0ba61f1f6e46eda0ee53731cacb78447a8dfdb7223836eb5fc6bef4eff32fec95595f8febfc6575b660dd49c3d0a31bd71f30c8e01bb464ad3054c3d82198 [...]
+    "W": "29bba83364c5273bb446dfdef41be7bac3e357ef10551295869df5704f6c510a043e5c8eb8221c3611a23786bc22fd36901eccd5f3a534a29019290498200da21161567cd490eeeaecb3eab79561153de77b7c8a634567a988f68078f5f2cdb60418fbd17af7f716040c4384f2d12b209a9cdfac61a387fb078bb416d3124a81240895d6f2774907504d75091fb3291ed0de99de836b14d27ab5c03ac5e6f514ef43b047be5675e5005c2b1c1c44eee13774d4be748e1345a0b0f9d35b9d525c254a25c430b58170460870716bb62bf0690306a6b3c7713e6165cc6025207c5b692c2e078b7ca2415c3fe15723e2af38d5 [...]
+  },
+  {
+    "TEST": 4,
+    "X": "0d5d65ad48c4a41fb712e196f536b2c6b3c37a408fd74d906f879e978b448ea7",
+    "Y": "a33522a3e8e35f152d72915d1b68fd10d1dbac443b3ee2e6dc0b22448d942129",
+    "C1": "28cb4d13294acc2db50c5be09de3c8b43c1f2471bc841da5323f23537df9d311b493c9b403010251014dec4a794b9a958229e5d4d28972734a8ebd5d7ab7be4befd200ccc1a3429182818e40b25cc11765520aa75880984732a4cd755a0ce6695097bfba949fb6fc8dca2f66c56e253099ab2bbf88994816caa5c329208c22aa83522d1cd02f2e6e79cef281bcdd3d0cfc139fb3f57bb081065190996518a125553f64c06daa807634c3b854532fec2b1b64287a8930a5e988b02b0a0bfd3300be9704db4da89c49e255b135dd25067134b79e6fc631eca97c1fb1127c9cd365f1651108f9ac6712711a3bca4fe0f4a73 [...]
+    "N": "b90494e574c6990d3fc9af1652448de0464df6506749df9d6626c62438b9d5dd1aabd670cb2c7aa9ac1cda6807a9c5d83eb3d24f16470561178f01b6f15310ed17eb298857890cb7c9df29be31a49d64afc4261a0c2384974e1a5ee868978ea38d4c29a3eb51a6aa76771af5dfc49b85a4736477062412e0c7ab86c17e342cad70b4e8c19ed8f596082d2821f47feefd6de54eaaf37426abc10f8a086c30101efc9d800265a43b917d56179ff14dfe8555da3a497dda4f0faddfc78fd05da79ac9af7d6988af02bfbe74342090f6495a81bab6d4fdbf01b13623eab791c231865fa36c5001961e0f056c1f2b2ea7c0eb3e [...]
+    "H1": "240a77b33261c09bbff7da293e5d907fbd44be9797d80ff4ebcc4bca488677d3cb1e830bb49818cf86c5d4ea38975440ce6036d4ebe0565ed923f439f835e27c5f30b8387d7dff170dc3f80a556f41e229d0dc0f307a6434649003053b42e36d11872dde9823beca591b3467a834da52ff9f7b11320266cfb0c884150937549afd675c4731bb0f60c5a58e1d73d94db2dcddbd426e17e1e4d85734b5418cf2e8e19bce5ed69e660bcad7862e47a1a5195e3792c55ec3e07843070683f2a469f21a9621ac10d9fd63c1039fcacb188f439eb6fd0af65daf93b19fab3e1fa8cf8335cca50656d17c83b958efe66073554a5 [...]
+    "H2": "17b6799772fd72fa0c9877561200993db2dcd13da414ec35999f7ef888d209314586cd131c0159a44b4d653cf6f1f68f2d7393376f9d44ba3bdbdb606f07b89f2f9af4e2fc7754b1bf0f1e6ab19aaffa6230ab7bdda6bbb8dd16c20d5fcdefe5a91bdc3167150cc98e66345a17bf38bf44115d3077803540b53be302267f768ccfff602e07d2ab302edcec8da34eabd7bdee69cbecf0143df1fa80e67a6dd0230d4e2b038f04924b51cd0ea48f09052c34182f7d16e89d269f816bec3b237c88a88af9072ef72606ed7c78e3a2b02eccc537a4bf967f0d6cee9f150f7cf8804e16c4863f6e16bc3bd64c4620e8f128813 [...]
+    "NT": "9c9bc9253874a40a5a355579224cba50de2b41b28e6090aff68358b3b427b6c1d380dd159830af170deb982bc00eced7f4fd1767584d8c2d9679112404d565caec1ab17d20a2f0266fdf318a98cebd98def0aaab434e5de8e2231f899cd48db142b2893bc3c61bf679e6ab1132969cf78764f27b42fc2fef54d08ef578d8b26fd6809e65540d8433d3d7624a0932b80a71733788371789c3fbc6328020e844e8b9630346bae67e04b6ef762321dc75aa4def408a27ff0b2954a7de9c6daff0a21a3081ffa60a98af89ffea10337c6a8644afe0f5072cf1748fec2653337a85a8bee2d088510863383893c86be8d76682a [...]
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000ca2efcd57a4ed33d138b5b38dffd5196b7aa36c4e4efd284b334b2ed584e40d40353f9c35117435a40aec1fff908ee275155051ad193b80b2104226203d5969d3b8048219f1915195161eddb6170cb6e7e92af983b2a19ed3c856c1a2dd95cc4",
+    "BETA": "7ecdccaf4bf6e1a02d8c9bd46da2f4699f3181acc94bc2eee95d5a33e9a04175d92635f8c3c1f99102a036db4a9903b8466c8cac928cc773172ce4cc2b16cf3aad97eb8977aac1995447ae68431fe96a25ef3c6a40968c5797758a05daf96de264321a6c1d7b2adac35f4813091a192c88f212203232907389885e37a19a95e9cfcb47d4c35423c6b8b4000697e86a1f93abb58aec3f4fa849b561bc77b171201d1c3f39759cd90718e88c1573bbde12072aaa15364b08d362f29570dc9d6dcf2b078d7dc719ba3ad8f73ad2361af219c37970b59d9342dc9efdf38608f3be9e0bb76352e85507d7f58c19537354dd7 [...]
+    "GAMMA": "6ef628cb0063385b25d629d4125f7e4a2ca134705cd1dd2bc8b1914431700a21911044501847397ffb950e3cca0a9cc3e556bc451da0f2c020e8838a3c81ace04dcc22119b47cd3fec26c248cdc651c92da9b10c3c2567a25d18c46fe2f83e355b66fef3d0b21f8819b4b7508d32d94eebeb432f82b64019febea200be811bec252e6c0f096090e709f9084e1408776b4314de23310ffff2b1d0e23665e3a73461e925e41d2f5770ea53845be8d5bdb4c9b84eb14b08b3afe1cff50f8e2c15a0387f4f574afdea60dfa0b2c8bdf0006712bf927cd57856e067a1080d12b66558c4d71aaeb3b8fe0c9e6ca30b58de33 [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002558cdb52a093d567e370905d9c9ef5f828988c65fc76ae022dd56c0b225d75db82eac0e618dc51a5053f094e9d4e651ce483df5f923578bb06db308fbf176583109144a405f9276a5080534700e85dabaa6eb248fd9c6ee85a7a3fe914290c561d11e248ddb9083ee3fc7a58eae4a55f2f9f067d0b76ad765c30b5c141606787cb29b7050c7f7ba922968919f8ba043 [...]
+    "RHO1": "000000000000000000000000000000000000000000000000000000000000000011e344fe14043be05776eab222785285e3e277333bb492ff8151535495104ea06842b63bafa4507f60e43429a9966f94cff0a80ee455488797a74df618dd5cb3b6aa44de7f0d0ae2bfff382fd85604271c0f0405de4922d8ac7a4bb7e0056465eeb7743035fbf9c8d4d5fb246e5db797f0e33f6a386cc05cca69634b18bbfce27506689317f567f3f366e98555e1ddb10f0ff123e605333baf493da5fbe01b6e7c851d6fb17b8a84597ff10f5a364be58803963827dc4f087714e769a5b0d7841b12eaf258c3d6f68525da2e7fdba77 [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d44e786680ae4e18511c960a452a70091f26b8b8f6be6ffc35c012f15c0611a45c9da5da885f23cf892a25c80b1decd7aeb2a031e6fce52b822182f429c03211144d9c8dfaa68c0fdd7f9ada18f23a41e1969647c9c8487d47bad4185fcedf898f670c7b895ab1d1bc830884ce0cee397f4577cf071b3b727025a86007c97493701ffc2ee28861a02b7650fc6541e [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000375293c1d0190655181afed6319fb78e3701c6ba2a5acf1363d6e39c6d7a705dc3c334228205d2e2c70af38cb681767c96a20c23cd57e3635f3209928e7fecc13c82295b2841742a7fb01b86e68920324c4226a65087f02c6f65ce839f54f0a62a16eb2fc646b732b399f13105247a25e2cbbf34ac8796fc24f78c3a7bf6967f95a26f2ebe620573d70995eabafb1b25 [...]
+    "Z": "2e099b1a4a485cbdf9d65af8caa74308c1f9278fe20a7ce483ffd5c6ace65feef2447e9f06a6c203d4eaa48b0716e7812d9155f679db67c2e9f639bccf27898d6bf555f6a2274377c07365f2601ff2689184f621ec32eaaeb760bfb1508497be37ddbee9048f829eb565eda0931ea897ba122ea270d4afddaf85a5152325f58c2b38080649d076e945c946e714259de06eee6b9f36f27b9f009d01285e1e1962b24a6073792aae9270b6e69d49844c1c76386d3d7656f1ce5a3f58be7aa64188f8969018f1a6464085819c291c3b0b527a8295002bcad8d45a7fb944b58f5d48f22005c1a860c80760ce7c84f907835230 [...]
+    "Z1": "1ed52d7e0a25345419f96e59845a414b6f21ef755647a9f6be33f365fe5995a0c73391f4e3ea67f7446afbfbe2f700376ed153abbd3a2b36f21fba87ffb049b595db16563f9785f1d4711fdf86cb98828876b8889e0544f90a121900b9fa43f489604b1db1ef8ea9eeae8c2173faf6c550284fe1512e17c7717049ac3949bd6e5e579b7250e1b0c0c07ed7f2887ee1bf2d29427cb17dbb46df6e7e92098b000aa712e868ca5a5feee3b0aaa7bb594a23179242282820c2132128bf8c542d6491d2c9ea2b5a975ea940471c94f1434d129119b08083df4ab7c056149ab357a526c658e84d0a6993aaa679ea9c4aa101a05 [...]
+    "T": "81f2e6a6c3b8321d0c69105f535217684adbfc368d3a1e5c9821a9a61ad68268971b47fc9089fe5f50a5c80785b2a8b0b47a59c7c504a743d62b9bd4172a31ddf5c3003c6f6df8337669f8ad75260aec6834b0bae014374d033527e19b18be00ee413323e793614a7af36a2aac2da0b99622d77b0be4e2f6668e80f4ed07a62734e3ab292c869d291276bccf7e50566ea261124dc7c9faf57e8635a43ebba57598f943ac1d6dc6ce626018a1f27bc08aa3e3d6c16360467322c685e7231ae07cd36ae5795d8205e585b216ea5a7acaaa202e4dc8ecf495d75c858d58cd713eb8288d2e42730c87422da7e45673aaef2142 [...]
+    "V": "4d179d59808e4a2b536f02dee8d33a248e96c33474b95e929faf72a0255c11fa30de2434831c08132a3e858acb3fa10ad2ec81063e71b2570cc962e7f2138cc1523f1104e551869706971e41e728495b78b0f8812b2b94f22d19fe989af3f6558f1ad75de0e50ea2f0791d114358bc8edcc1b27799e67cceea0a6f4b4e60668632731e340f009870b3fa4319cbefe80d05f6d29a4deeb530fb24cc0cd0bf307ee1aa5efda800ea2c43aed36f789aed560457546c16023f74e3c05ec0ddace49ae7e47abc09017872487db8ce95679eb3235068f88773c183147d53abb570d2738edca1e45ab61d65a0f50df5d90b7e070a [...]
+    "W": "47af7c27579c350a79b752e4342fb04624ded11c9d01e77a07a0b4f112848cd897dde49bca13c612f4a027764a5ab9ec645e66b00609dce011218120488b96100453ddc69902795f9158851c4e49451182a240bc0f3f3556371aadeae0b85ca358f276dff4cd2a342e76f5399884422e353fc469a1c4c68680f3bb7ce07dd01ed249dcbc6ff25a25b6e30a72f29a43aca1ac294b489f619ca91da97094ed9465539957d655e7d827204a856c853854e775ade46711feadf1ac454345482904c2bb00fa506803532535d42c8521883457db54decc95cae915844f016cd6649b5efae9f04bbeeea51033b9c86ca88508abb0 [...]
+  },
+  {
+    "TEST": 5,
+    "X": "348ef8bfec8ac5ed9866be34aab22d0e9ffdcc8f426324ee33f511beb9453094",
+    "Y": "7a2142b9ea0941f4b78a6cfcfd9f8abba578b77e18a35bb9b65b863ee952c86f",
+    "C1": "474f026b9643e6a12097faebddaf6ce0e05f1cee30cf85cb4bced1f88df89352d4c74acfa3b1def03d195701214b879536b39d94a4a94a8e8e356f7ad22935be58a588a1fd8fd3e66e152cb34b99cc7e2ec57284321f3e04c977aa2bc40dbaa1fdcaa2de8584bfe881e3ac8752e76d4d4135a203b882ceec4ba3e86ef3b43bd00a04dd9b624ee0448d53c356844a9c38b0e15bbca9c10fc038c77f84170d9987e40450c0b7c3ead7f66fd61a1784a304a584ceec2403b85fa310cfa6818df5a2693eacbc2665b8012f62ef71c89a8726d979eee07e34e27fea10f0527593b0adc541f63a21fbaa6d40140157ff878c433 [...]
+    "N": "a99afa8ae67e3f5c25568dc3f6d42d65cbf27701d0129df93229e3ff00bc36fdcf39af140849f286ae515be84367a5c9263f898aeeb988a2d98b404fe84fd77da0f6dac8af9492118b74d855ee3363b96d28205678f8c0c87afbc1dfea5ff2431d5afab9a2da05db6d16e0b3eff0c4182e2283fa2dc4952edefd6ff8bc54162ce41d175688e5958891743cda594318da0ee9c2a5ee896c612fd897b18115883ce10eb8635d7043d1cb07b15879bb061b3b4eb9aaeb3e55b4affb66ad51694f8b1b665bb261058be2bfe2a23d0f23ec99c6eea406f5afc7c642507f8841e6ba85fa12f5a89525dccfeec00f35adf8c300d5 [...]
+    "H1": "39bab922821b6033cffc3982a23d7ce76660e53acb4a5501b51b88159114d60814df53cd85f3ad1897bd88a9779ac826de89f458d1dc29bd8ed11bc6a143b88c0d302f8cfd60b4460a822e3a6313d83ce6bade99e071f987ff52e88831b62624d4ec672f849c8daf46ec5c6069b2f558b8ede9adc938861091ed865c234908f2a2beffb7a0aba88236cce88e64b43e25a011c0e999aac80e2946c344a6c32439db37d2c6fe65bf42c12131dc6c062aec4d13b240cf8cd882d6e4020615f85eed20701357bcf6d0d4e288631d3be81ebd3509c6894729a66ac827f3a7e594580747d61836a47d5c74cdcf841fdc9ef0d7e [...]
+    "H2": "43c6e5175dde8269b544f1e69852145c645400a79be687aee34b6e47823ab132da8e58b2629697e807cd1d67f7bf75e5aaaed23ea5896bd25b0b24bf794057c3dc359bb805d047bd4ffb0d6461d054bc8380c1de405174b8e6e3284713cacfaf2ffa6e916f114288c9fd7b059212d71796e4daf5392f3ae0e97cb506342fb6c28cb50b6cc0de0b291ce7c64ca61b303bcc890df7e2000c967da01825c3b8a71e117e012e3c419ae9f0b6f7e4ec217add0f48260c9950ad1a016be1689a7db2e2d1770992c17d83251cee54a7ce1d0196713b9a2b4f5ac32217d189605f85da9b63089fa57bc0a043689399455fd45f56f [...]
+    "NT": "b8d5562cebee1ba65ed1bc96f5a10d7f76f804ff76065ae71ef8e9224c1e8ecaec249e4ef4794053866b9052780ca0adbb656e56427d5e7e041b358a5f23036655a3bf3d180a5795f1aea576670ddc9ee3403dfa1c17babc5d86bd569c8932e404d727dd4ce769646413617a00c11527d40ffaff50b205ceb73de9591a3e614c65f92e1bc01d6f78bc8a7bc349eac9f4d432efa76be3a18d89f49abe6ad2e8fca17a2f100103e6622e290adcaa7b9d80b5fd61c2cffb533de4b9a8c8a0376a595c360f193319bce77256812e972f1e4bb2e38895783f870f7958033a59e3023224da56f5479d6fd8d990d361c4b289872 [...]
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000b26e2084aa91e619f76b277ed88487bce12d8035b82ecb8aa3236190f0b7731e4039de6938d6cff1793780deb57fefa7528078b935cfe23a6ce0410deb89e42698bc19874bffe1290e49fbb57b06e249bf7d2f6dc8c99796b7eac9ddff6de30f",
+    "BETA": "21d1827702c40d2c6e22dbe5ae57e318eb6ee290533d08ca8e5dbe9371732c3ee82cd51ac359f7c1544949499b99c53ad457d88988585bab790755b32182bf475f0caa53396c0f3cdb9942046d0cac62953c45eb22fc6e5dbbe9ce465031673df7b87f272a5296b69898642300fe4a9c235d1f899d88d1e618c5ce60bcb27d6a5b0f0154628940c3b675fea8fc6836114b64cd7b826ecd49502ef18d02d0187f68c74dd4ac1ada53b40ce27a6277c038bf1741d4df67aed46ed0857f314eae02b85fd79b306ada6853fc446defc711b45b638d46008fcae3da87ade1d3fcc1f679874be36a6e4d3d02c754c6515b735 [...]
+    "GAMMA": "03ce605e6a5d90be32a8c1bd35c160a018dabcb60d58a95521eec6f92c5973555237a2967e6a89886f1f172f5ab3ac067f04e26f3e9d6ec01df1e5af78e56681b7e79016d4ac3afe14ebdc8e555f1aaabd7e3716ebe6d382c406f1f2d131aae2fc0c9e9ca18e8818b79976738ba9d9e2515ae87d7c6e4e2575403cc2f5b0ad9fdded2ad5f12e7686f5e5d745ab851e154e8158755f1fd4b683cf756ee2e9bb6ba0e653337ac106b0edb0be7e0f92e758c628858edb809ded9005a5dacd2c5057ec66390793b687d198f20e37e42a5dc8250f7ee5944f2d7cf003a85edb287e1697bd1ff1e4250415b889e9c70ddf02 [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000571ed6300b126afb416d4d187a95fd63ce5b561f756ba3faa280797dff874d18d2ffac2d6acdc8eca4f90085c81b705de40f3828faa4b9e9cd2ae0cd0399a79c76be497953b52f2552e8b956080963208eb7c2e49d7bd43a8d8fbc8a5aace41e2fd3cd49bfe5ad36204578d6bbba2f00210c52b28fa48f9bbd11d679282d44d851a5d34fdb304f4d3893ae875fef1b5a [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000002b436ee347a7d5f960fde338fa90d90317535a47f474bbe13fa5941be0d8e2084d57da653c4eac7e183cdcb374d231d2265ace7f8c9e10a8aecdda202966960e8a06fe981ce5809f5bd59b6a00e6b0343a58d218b0ba3b3616e85433e89bf9f0d862287ec9173f689f0c093f0d30fd716a812b1c176a9b7a45ca1fd6752929c32fd37264b8382541fe1b8650b2e0a550357c51fb80e134d74db850fdb2eaaeebdaefe64e3562e91d1b18203bbfdfea93cf77e8b160d99c49b5664fe668a7b6b6a559518af0b31d138f0cf8e664cb70b [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432d9e5c21ec50367ade18f12bc1ec2d287b1caeee860267fb1817f58a52c9ebd5eea7762556e9bc44581a6d59d8e3fa5a8d154f5b3747934aea4e7ab2b727a7456e7fd46c0b89c025be5be606e75fbcb147e4b46c261d43bd69de12138f53229fd580892e75b1b68df0be9b34112ba8a62c4dc740a00f45242c3d28c334f3b7b1f4dd4d507b2ee2a3e10140d4e7ff [...]
+    "TAU": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ddc8d0265bf5f0d8873b7bd6691df6872afcbc09835292e020f0cca90222dec513a6cc3df6f54ffff56c3c2b3a2669a1672ac7c8e456de21b7baf03bebad9e6ee3a424dbbcb37aa1c402214fb9fcf3258e73ba48bbdf45a85f301844d5efdfe95b3a77e31322ee409debd94915320223f76aa5e5c81cb54e32635aafd2479247fbde9fdad13ea380fc6a39108cd9850 [...]
+    "Z": "9b89a7ce1c780f7b6d9cf6031e450b05d804933cfe19d870d60ee2b73f6baf1f9132ce634c88d1b7d0b31b0d7d6460298b00fe416a9f43494d4ed96055fc8cfa636054d1e49455f1c657687732a80d80ab7e36c3b2451e4700a815fe7eb911a75bca1425454dffb84ba1126f647855d22716d52867406345ae0640f88b1b09dca3c4022fba846ea6e8e2dce2081115cd90db3bac96f59f9e79659211df4773d48ab64856c46e535d4b6fd8dd733380af6b264f04c2da859a6b1d321b5322f527a11946c0193daf39ec950f85bef481b1dcd5bce82b5c28d905ff8f09a13d86f8497934cdd715048cd052b7f73a33323ec6 [...]
+    "Z1": "4fb8f1b15b323a1274d17eb6e0c6785721133802c960dc5202597c1761951c9511a025179eb3fcae1ee786f854217262abcc6b81688f8688c0aff802f5ea36b55e308f63315b49b3281878e8a1e75ea793a134f73af51b2c02070efbb7e85e6b73f615747ad9766bca3a95b48fde73ef4ce5814d1e36bd81855187d5f8c83cec45aabbfb42171a656ee0020dfb0dd543aa85053a1b5e555c5dbb2966c14badb4f1d4e8cbf981025c07057fdf54aef555a4f63d131babcd6e445014774f9d4641891272b4dacd2d876983451db8966b5222646db4396589b42f81ef2ca1894bd3ab42a6b152c474242b3a62890143e11ae [...]
+    "T": "8b640a08e80bf886fdaac5f7884ac97d95886126bb0576e99bd1b24e697f24528960c29d935d2d1488db3aeec956211c778f58662bcebfe73c6b1239c914a0d6ed77ffae8daa3f17fe5eca77b511fefe13049da3dc7f8294a75e3c45a97b653aa863fb3a82803db0be595fd5da72103fd0cb30f7cb14ffa03087037a0f6c40694ab5a5b8928e0deff0f4ceb312ed63133de6518465c2345dc252a7664a394ab685a4bdb3a983cba0f77c13cbfdc86eca6bf3d2d3547ce39343e80ed7506b574243cd7fe726d6072932b399add2666fb677798ebffb9af121c45568bcfb568931b8ebf78584eecc7f7ebd2b3766905c288f [...]
+    "V": "4b0c8bbd6b76c6ddac5433fab1709c1f0e2204a4a3313b946ac00f9d6cc7cba41e9e8968af1a257fbf1eed1de8f1d236b035b0679eb4086fe2d0c63a74f75fec6021c616243d544a9b2099fa080ddae675324642ff91567f32dbe4b23485be2d5e78f4da71ed50efaed604c0dd0bf43bec726d3a5f64529783e6331d8ed243456989058f9696c04e226d0db3adc2074c1b1d3d243e0b6dd07dce362ebc3d8beeb28f4b824c0333e86c7ec0a8aafeb45e9f8966c967e1a688351ccf859901247721e5bb783e2df2ec90c7adea76bf703e73379f3f9b00a3998b425418f6c94f2eff51477dfadcbb7103f50e7bfee00600d5 [...]
+    "W": "0808269990a233f0f203b46c1f4d89784baa2b4cd80ebe1d4adddc3ec94f0596544926f2623d4fd5a36dda638723e316113d0efbc7682086a57cc6e7c27a18708aac5ed473d9332457c2f87b6be45e7841740cabdf668828caa16d9ee7b6b70dcc544fa1016880a63b28dfb5a5b1ed4421e0af50c245c0fa22b0a24062e8ed63fea28e407a71ed41644422254956f2af1daffb553219419ac92a28550890f81fb10b741456d23cb03c2f3feb859701cfd182120a0de685ecedbe116a3c1f1e96a984640010e6a8fa85e332f4b5242e561498fb2cb26f9a48d0d53775efea853e269b66e10e62ed2eb01157874e7e675ca9 [...]
+  },
+  {
+    "TEST": 6,
+    "X": "bf3f16e4b72c93b5aec5fe3bfbe7d6ee7a1d4c4d0aa248923272d5edd74ab1d5",
+    "Y": "8037ffc9fb1c17e1a1328277d16f4b86593c675ff7e0ab5345eae009b633ce29",
+    "C1": "674f0885cb99a92f4b7cc250375d95777a7e0690661b5ffe8eec58b6388608bd42beeebc133cd0f2f410cfc6888b9f186a69b5904626a06d556921285b0ad460ee0070bed5c699541a134109fffdd137d3d288feae0264026430a2c7d19114582778c51e2b03cb79f9d70ca763c2d37f3ef1adb51c22c7646c1734a5ace9a9c1ae4faaf8cf8396036169c5b80b3f4a4155e06cb2211f61af6b0b99039d5b28a792fba53e0862b4e9f215bb256f6faa623851dcb1017bebc83f827ad5baaff7f0df87b5a64172bd6dd2b104f08e99cdd7c19ae06fadeb2d5877a931567d157fe8c87e0a8a9f3fa138365528b92581f8773 [...]
+    "N": "c99a67c86b9c10af44e56df33f28d6d82c1a83054f386363c5a1b60316588263b5f90de1cf52b06ad93e395566dbe6127bd50f8fd2dfa9ce9b1da7c820f38898044e7d5164a8f91817789c0ee0f5ecefe2e73cf5c02f684ffdf77c77fa7b8945ca855bccd1f746f6981ab2ef6a27402882a720519755c4b99b562e9911f7af3715c29cba19d47db994cae657a7c86b8f31ffd517250cf0dc1f054fe3bab0881fa526606ff3350d3fae406fcd17bd554c927f7685ab8cad3fbd211f41dd250634ca6b0204e4f7acfc781350781035fffceece2f84b9fb088a0bba3273f33ad8fe30528cf307008d85ad3a6fadb73beeb940 [...]
+    "H1": "73b5fe5135a0a46abcc1292329d6b93982956f62691a11db1be420d4cf6dd6ec79ea51e15b9202f2725fd9c017e472d03f93f604fb31074d8d4eff1bc88ed44f601d09fb3466c366e648c53fd9b5add2b11750f5766a1a26bb31e7aed7a79b06db78d67a63c4e12049d41e125efa72b3896437fdad1f2ba1e3a00dd65e6416c93a01d77880c39d18e16cdcbe89b6db6870be52bef130e198914951551f923bcd6f0f903b17dfecc252ea54d0a8eb45e17fc3f7a076cbc7d21dc73c47ab1d9aaeb5fb9eb4aaa1074c5c5a91cc1beeef7403f0bd5fb80183cc16c254ad7cc0b6f4b6dccb8b184173f5fd24fb7e4341ad3c3 [...]
+    "H2": "3a83d512547233316c812acdad94ca27d9afddcd879fb93357d2aa8ed33cd162e8562205d1ed36a1fda025c59709351358dd17d44fec3b7adcce097e4cbe0d15a966bf285d2665535fd1bf82b5cd6ec911d7f2dfd9cad2315eaac54151c5965842a6c27feb8081366bd79595660baad2cdf33dffcf2e19e0475db0a33e36734c9fd788aeb0a1116b708924d3f703ef08b655b4e5266239dcd49976d0198847e3c2ad719a4f77eb964495edc3425e04bdd72447f86e2969c005e4a5ee3b4d6c7096cf0f6cdb8a4fa767cbd1c95ca0055f874dca3eb29c4acb6279ecfc36f2328c45d8149cacc05b0c6dd0d1556cf6f8fee [...]
+    "NT": "d732a7a46bf87b14bc8a80b47a2867203148a8e6835f02d0788a0624a0161fe67c447f4e542bab2ebc19afb9a4c279f06c3f3797ee6a98bc86f9ecf92118547db3c8a7241e3f184934d227b408f68958cba730b5889b159ef3f75f466228788455fbfecba32d3e7fc1e384b06d116b6f1403ddc9c0974a127dbfb009378fa38fd5042831da323fc7b491f98e4b9dd143fc3c94c339316fee2ead9f19e25047fc67f8ea8b3b11959f544fbdef7da6f663513cf4946d34990d989a8caf60112ec6c1278430715a53c0374d7a1f3834cdd1fb4663637f7a09398ea45950ceddfe667dafbb963f617513f0c65ee0588b85340 [...]
+    "ALPHA": "000000000000000000000000000000000000000000000000000000000000000009f9b89fc8ba526cd1f060c00bbbcfa78b94e6299c1730dd553db0d0ade959fc56643c57f77777b1c738e213462e201bf0ddaa64d311a1013facc6c5bd7966c468dc26f8c10762a38fb6aa19de1996982f07a6b23f3dcfef181c1f71d29e71e4",
+    "BETA": "be2ff3f9b9f297da5c5b5a9e590304e8afad6c0aea596a065192f3130191d8a8422b3a9cce96d308dada3e8721d465c2bc1e3be8067542e1cb0f26829687714bf692b79be84bcca4e296aaacb01b72cd541fca3553de4c3c701b73109c0593d8c99cc81059469990cedf277b02978a953a373f17d57ec8af2407c680f511208411aad7acc7dfdfaf849d2e6675ef85f3c5d629932d898f2dd0c156b21f033e4808a0efa43938d95450e2a18d58638e1d30974203d0f548c8aae4073b982f74c573f187d2880c072591e9bcd17a36e1d0591bfa8ad968aa653373533696ab14427d177cd21900758923842a86ed580c5 [...]
+    "GAMMA": "02c1c20850beaaaf67a4914b888e6f00f118e6c93340373eab31ceab0dc448f1a3a2209247d78c1ed6cfe3590989af92a239acb677cc92acbc47b56f36a10e9abf83fce0d35b522ea489739bd7e2aab16a9eb4284cff6f66a8346014ec39bd8668a160b08a778891040cbaf9e2418d5b5000bcdd1b7a9551b5f593211ca3d599a0c810e42f5d5443657cf6f121521ba201f6276659d03051a42371200f86fdf6684ae38dd550b2f8f01aefd2c0c55df1f755b25211c57f51d5e97f3475bba0be942eb16ea1a02e22d76177bbd05fc625141e3438a3adc79fefbfc54c19a26546d157728bbdb750b0c219282e5bc54d [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006542dbdbc39b619b5bb2d57214263d41e38ef96ded050c1989b40c5ddf247d6072d859fcb0ce937a7585d8f93b0dcee46e80caf2798db2554bddb397bd38a87e26649c7f8efc059e849e9209f46fb1668c443c10b04b8ac62e6dcae9e8363590d11f43493f94597dbbeb7862c44c5a2a174cb9c7887fef84a4001fb19836dfc40e2d8447ac3a3ccb1fb587a565ead875 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000002437bf03ad8c380bb1ac61d1e700736f39402a9c65d81c2f60398716b87f17f10107279bb63984138cdb9b51ace1dd7d3c9c60291d0c04ec8bb6bdf636c8c152f2545ed8e7f50e0261b1ad239e74567e65d3b4275b18c5e8b29c345ad1a51b7348152b9aef772c923cb7595ca405c04b0a99aee7b0295f9708c862010f2ab0f4e3c036420af56b64981aec4c4b2ccbb0ab56c53a8eb8a7957d995ad4476a145f5d1f9d66ef7ba2283b0bd795d3f2516244237d6ffeccfcb2b3a20d546cef57511d3cc3a3e893812d669609a5c876691 [...]
+    "SIGMA": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b772e157c00797793a4cb631a787ea03035cf16281273d191d997dd98ea3cfff29c4bd149e1f18da4ef59c1212b1d7ac16076fcff3be210d1bf110898a8ae4ba2ec0fa0332e39e6b65e6980b78f68431bcaf6abd0bad0eb88a86d63718f16fdb9308709e2ddbb9fbeddd8b194330480d77c20df1d9a3063096749850d118cbe8a236a352b544ae3f4e62c5bb5491 [...]
+    "TAU": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e2923d7923a23a13dcb51a7d2c8e26cfe10e972c3d61ab204ac9262a96957a3704ba137c1bb2b8aabef081149c7ac3beb94061dae15e7cf03f6ee1aa29eedef23dd75c01dcfd650c06f7825e0cdcf9c1c240333dba5ad8f5eb9b1f62180ce7f6d9c5101e67a533e3289ab6eaf3575b6196cbf193d1d116a1f7076da8e400f2ea6def91565d9db3172d5742e31b32977 [...]
+    "Z": "489fe2770d155ef05df803c01c539ad96100c71df5c615ddd873058a30f378cf701303851abbdb254b62dc9800084fef538c254cfe4e0fdfce5bfd520b3275ef69ccd39bed796bcde909a6dac7bd15ac91b24f9b5ff8fc7251825f96dbbc61666525f112847d75f59f5e5c04b3c05638e684da5be6dd4bebb42a49bcc5e6a2d025c94ca0017f91c44547973f8fe079d02da419cc3177facad6f431ed97ef2ec7591e0adb460e8513ac50293fced0f19a2c09265304f008ff8a46be113d80e1cc6b19d3989148e78b480a606728d7ccbdbae5606b26244bb401400f5124f281906434c10414c5bf082e346298361cfdc4fe [...]
+    "Z1": "b48f6b154d7ebb0b0d32d07bc228b9647f708355b673461aad043ab1bdefaade0b7ae4ead82675db73de533b2e06ec50f82d263c4685977f675631cc6c64fb2f61c2d0a75982721980c1a270c424fa9dcac7a342f89ba33f77ab52a180f91e149855094e603b6e6d882a58de8664cf9d7864bd8490a35f0cd5990f480bf4879a16b9aaa218a0283ae62fa501259c11fd70d4d4594d5221c8eecd01d82c0e1d1a6027661801c444638dd37a209d5f33a49ea58260413b6b9e2948e365d4c90ee2586bb700452f9eec12372684bc95d5c30aa9cdc0fafd1929adf2f8b1f6da83f1c81a56afbac30304137fec2b3b92b6ae3 [...]
+    "T": "196bad2ae5b86d500c4c617bdf050baf84bb5b14e49f0ff415cc0b14bbb113d819b16dbb3f54aeb0ea8feb9cb2e5c0a24cdb035ad5a44ccaa0a79ee6ed930aaefc64c4c09c1b4e16f7b940276964b54962cdb597f6a452fde47f35e0b4f1fd4b96e3e5fc19e56c80c598271c55da739e6760f67bd7fb812b2abe7e01edf81ca3a516758b36f6f27aaa03fdd560ca912123175b423d2491874996dd54bde5098dfeacfd55f0034448e1c0f0349688df5164f9d8c4f59169a10af2440e8d9e68070d3fd2c0fcf7fc0ee103b7a5199fa1ff8fc7ba3290b60542bc38239dac773a0920ccc78616511cfb28165f2a0bc65be786 [...]
+    "V": "4e8619abc301c1fca042532846a489163e261fbb2daa79a0088302d6bf42ae3486e076c333b3a06fcb645c8341b4ceb68e5040bbadf37c613160ac86904e99a68ce666abe2d56cbe08f1b1fa14ea238eff2f261bc0ac97135aaeabe039603bbb012cc81d252d79591882cbf6fcd653b22ca3c65ca660db02b0ec6dd7fa3231297e93f48b76a6c527977660ef1e0842f1cfa8877fbcdbba8090e835c8a80202544f21f29da006f18f40c3e7acc06837dd7146cf3cdc6e64dc2251125c4ab1f527db3d0aab63834c8434e34731d4e22c993f1a9ccd25fd60cf218017c795e06756e22378fb6aa7b6e9bed71f8e531466048e [...]
+    "W": "45952cfb748611f2fd057b60a89bae1ba106d172553c36793b04a22c8041813bda7107c329ca4bb83a39c09e43077b49bd2aa4b6028d932b70dbdf6e0a2c156b7b07cd84671b68c082bf67bfd5d505e2132a041cb601058b20738c2030cb0d57dc80ed7c67dd964d4709091b8631c438288d7bc9fd212a8c4e652075c19efc63f122e22ba3c63b73e2cdd14b98e4ea7f69163ab93b5a7a680b5d55c5fb950d64c43d8ebe15201ef1ac71d095cf44db4480ac970c06b268e98ffa7baac8631f3101836b58a443e0be2722e528daac3e0fed68f68e2c0f7933cdfacbc385134156bd8319b8cb22c1bcae0eaccd0b5b6e47a7 [...]
+  },
+  {
+    "TEST": 7,
+    "X": "7e7c326c27aa47ff5f0f30e46d7349f3a8272387d3d8b68d952f8719f1331874",
+    "Y": "3c57102c901b9285ae85537fb190af793f9909f9ecebe8916581d23b8f87b9ad",
+    "C1": "3ea8b71767b4f2f6ab3bf4cb10301af5e1a5be46f5100b6de738e1b97f22119afc6a2b8899de88d2a062554c1c4add75f886c39d5516993688c402bd771a26ca1aa056e08966933b7289c43981127321ac0a5b71992fc680256c7e192f928529d60cb51742f01b196cd2d0584ec7a4da4259cf8976a8812c57590fa223531ebaa773264b8a92a8c9affd6b465e0a5571333cb7c845ec61e18cc221d9d4615c16995007c6c533126953038239c477367faf412652d10ddecc28f6b0a8e83bee1ddfb9f92a2cd1842491684d224191612258cacabb510a90db7e02296583b7c68810958b97814e2b47d4777eb91d8a4a0d3 [...]
+    "N": "9180cb7423231e6b4bec203faa3f242ba53dff7c37f40477e0e9dab42e1218d5151cd5e1aaa37123c3ecf3779a38f457e0b82be0356e4f32272850a00a074b3cc7b3dda5a0004d1e70077191a7f2efa7209058693f17500694044fb94aa523b89a02430f657d470f277b5e8d22cd9ffc4870948c2c353b66d83048286bec45ff6c45893d7d31409353ac66b4a38ce4a84414b2e12d61dc57461eb717f142df542c3bbfad40b60f5102a724f6272ce6f27fd1be65d65770676b02cf0afbb2a57883aead9fb456a276fd4331b92f905a1e923504b9d0ea1084ff5d390ab7372516e85000f4b842b4610c8e79bc1da0f05b2e [...]
+    "H1": "0bacb0b762d33f034e576359482c49a55feded2530a18ff5c0d473d6c0ecdf1c8d301dac6dde4667da5e6685bc6c6f62602c177b97ab7ff470c4fab6614de2424f3f603200763386e2c341529451ea24d817336ba1541c9ca8cd7ec13779fc5a5c96d72cc465cf1fb5ba47f1f1057af1568768ff3309d2d684bdc030649e5d26ed8f05fadf9692994dee94e262d6dd774b8b9296d2e0b2e7608de0e3a927222515237606277352361f01f1da8e0e8bb3cf34bd1a80320456a4eb895c774aba538472e1fe077b3793426f9af9e7110ab5d9a0f9231083438c0650b26d33849aeda055da2edb4af85a244f907eb543fa555 [...]
+    "H2": "9a2d4edfb813e69f3c1f1e0a6bf3a76fc50c8c5b12425204f24a73f4c8584d0cf150ae8ab9761fef3853705ee265bf4d57e719b5d1435f35877b5fdec6ab9d222b03411b3c52af12759908ba007b7cd1a79e75b520e1d022edfd6ab7ecd53aeabc6d3cb3029e9f25488c69b60295b6106fd3817536fa9cb98e5d4f3336cd199b861948be81720d8234772fe9e6a9e018b4bde912d9d771baab5f55ed2f9fa3061e63c039070cd3457c66fec7a832a4b684f20609ab2df59c8a3f49f577dcc7a39e14c3b3f58f3f14213f3586d4256ed38389800f8cce9a1b0b646f9ee5090ed0231a3531d87dc63c48cbbd60cf721254d [...]
+    "NT": "c031847390333f4b8b1fd0bae9a57ddc4b34bb9819f5285d08d0943db0975b61a43286ca3f83e9fa8768d670189f6ecac37cc2b5ab7e1ec3341c21b5c66816c0ad65a3bb2c45825f85a53bb40b31a89c9ead55706eeb55f8a0819c8b3a5489de0c5911a3a3e9ebf42ea1f9cc152401419e33a7e15f8d3abfc4739890374472a2d714e17587350918ff7c82d9be44f5541f74a7de905b4dc9d0c8333fcd185982a5e7a9304551032115ea99e9cd0e33a9b0c3086cb296719394f95dbb0927d4857f8c4cc4d747e0fa14d1d8478a31a124607a91c7694d511e39c295282ba72953c1460958ade560cdd4f53a4a4191aa5a4 [...]
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000006eabeb3d44604e9a5131d69de1c930b37cc0f58be5b20892f30f5f5f83206f5fc67e576f207d67ace53cf49d8a9111785899fbe2266189155cd3c464308fe627dac64b8097cb925a1988cc811110c899eef3d1fe3dd60787b760a5fd56f89530",
+    "BETA": "0de765de803f9293dff90319efe900ec36cabcfdd997181cc4f05609991376833901cba4e4a80cbd6518456e35bd6f96ad52def6be3e0a20b16e1bfe098161c0df0326a927d971ee3c6e192085bb21ac0e74f28ae2508dbbb7251d18a1b1f0514302c8fe0b3ebb98608a94dd0a6964d505e66e0f64b70cf67d77468821ab87707fadbb67a0534013fa31238ce00b0a1259ca635e74165c3a833b3a9016785d5272ae139435394642b9a72786c7a4ac668119d7108ff8c3961ff69beb3f1aa37f5399b290334949e34d6695a312f225e71eae910d1426c433bd820439d3d1c8cdf5bfd03ddaec8e6731e3ac048bea418 [...]
+    "GAMMA": "4ea4a4ef80cf0e692ee5f063b74d05d32829e29c2a3e73b2c87409b1760470f5fa67d5100c5d91adb71260d62a04788f2ad63812c73990fc34a2b3c1d1c79171358b50bac25243a5a321d62a142d67ac767168e73835228a102922ebe8659e103642f8da2a5538aa3b620675183d6f08ba131602aaba437dfd7228fb199ea13e37900eb1084ed58083be2da1979cff5c863a9c65f78e8550a4814bb90d4820315fcf8afd05b35a42a27a38bdc540a3df7e9ab172f322ec56e2d82f7b95259db0fff5042d0093625bd634bc8da464547635762b8aa42c45b21f94416b4b1a80e8aa1ca9b69add8e96dc487f7e9d2e84 [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5b27c4a2ce799df5f8374e945fbe08ecd4108204891387cba73802c1cc960e5b207c8d4eaffc7d6530e8e5db5e441e51c68208d2f877774bc95c6fbe313bf3196391ea25612a9f3a1d696f11b7e18dc81ed900bf8d2a8b4ab7d66843dbad21dabaa530ba133540729e7430deeb2660baee9802991d5d76602242556829e70cda0f7094365a5a8557e55036c2d2528e4 [...]
+    "RHO1": "0000000000000000000000000000000000000000000000000000000000000000ba9099811831275068342be18a35853f25d16836a35dbb76d3f1eccc80b6e056f01371750405674eb6e7978c58d39f9718bb9b66e92a7b78dd6033de80a80e34275b4e69b98e63a281767e1630ab885190a665ff9ac4b5d2244437befccdf1d474257ac6e75da0054af4ff18697d05acbce149cc542593f2f8e57c5cbc7b18137166b0fd29e2113c616d158c9048f9053c44284fb3603e6d7abe9a000c425f0c5643f6b3518f32d5621c43900a1cc9f076b95abfd4a2d794ab8bbe4923056524269ae8e62b533f6533436bbed74c961 [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b77c48f17eada1d086ba65a8c76d808c6b18733874e8c7cb7a32cea1cccc64e35197eda0272b6f5d3d006f6e667adf78bf2e54854060cd763b0fe51daf65ffcc277bef6dc33d05b5a2f591f49d0b6a4d5411e5616aee7e6d7fc978dc6f1f0338dabd38b78d7828f2ab4f365b5551a6472e34dfc58010871f7171471af04e040b51f5dd88cafff3a457a28388ff7b19 [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096828f002b1127895723bf927df1c94bfe3973a5b14561d891ba91b7b944aecffb27692c28dda04d5687f0810a6179974883a3a98576225f630c7c9c74f6871f1ba1fe8f770dcdad877639e77520b9a6c8244af529ee40839471db5d6b2dee86e282531c8e103d69e5df4ca53510d137ce86deea9c5604a56a71dd7c7a17bdc5f79c66949dfb3265b3eec95b68bc8d84 [...]
+    "Z": "464928ba15c63b6f08d5239b1d9b91eaffeb3b4668762f0be8eb287d1861454a1f06d8cb805ee72d7ed7b5d3474fdb3fb2469025c346f1a0cb51d01af0363e089a34540e69a0a71cb586f564d2561caef2a99bba0e083cf463bdf75b73984052c0a24bf27fda3c3be651cd576891931dd08b8cbaccb5d7422f46057c4aaf4bc8eff51cb54724fd5ba8b3ca1fed62d26b4bd648e0015bd2bf9918b282c83b3a9e455bea38d340ca157b3c013e47d2a34ef62bec5a190cfa5afe45eb79c3c86999ad72710ec39f5df3964c3c5a670dd0a19dd7ad7a14e2861b669a2d29cdb4a67469f41c7d013c5aae6814956458999e4dfb [...]
+    "Z1": "637fbb5a18d8e00baabf90b48579066e27e03c0b9fc897fbf064037c32f83a1f47cdc533d4dd3ce2859c67cdd8b90c698da8fd64412f96f58e4136102dcee64e41b567a2419b08afd195c2d737c866d1fdfd6619aa84de0b2112ea001520f58b3296a18f4178c3e971f14325910e262dc323f55ab8e346adcf52e8507ca6e73eb3c00a812117f42d4f41f2c7e0a3ecb4d1855007bc20d4eee87f32e40f6edec5306b1eb49c3c0b5824ca7a2174019d36c72719ab38a87e6fd0a2f27045f583159719a5a81aa2237c793c6690fe2ac923246f6d7693d6c326be9912c0b1d547462913a4373884e9d4208e23f214d6c2f43 [...]
+    "T": "bb8643c19b8434fcfef216043629f871650fbf90ccea7a102d96b651a0324036a049fef05be922b5142057504cd3df1c63f6bc6f5de1c57f34a074b33510cbcbcaf470f9458c14e4fd794e848c8efaab24df918c33e282de303a7efed89e42a32ad87ddfa169f616f999719b2c299514b0a23dff29cabd1ec4403aff6ae61ade7344af4a75b29dd4a1a05c1b82001515a445dd3ae5e77ac25c21a0fd9a6300d62cdf713437286bcc99d7872297f970ae87a7089ea18dc15c8de5889d8e97f0ef42b23ed53e5e80612e850a98416f1bfd659a2f45bd1fb42bf72b8b8dac1d5da2bb384ae3333d2f4a125af39742648c3bed [...]
+    "V": "0edf46a7de071144b25c6328a604c60704dd69b1a83b4f5510a6e8cb5bbf19fbca71d6fff8ae81ec1d992b01c6c93fceb70f2186b5e39fc0ec2ac6f16efa051a373562f7a423dcf6e252e12176da8f51c3943f7b518dc39221f1176044eedc253ee37ade89359f2881451cf38b609525f22b0d49f07bae6c412e84c5608cd039db6ed0749fdfa0c1eba50960f5b60a870c743ac6acf89ee7dd18929cc2fdb22e94ced42957fac911111bdf2ece0b37a9b0f3ebc8beba31e5f91103b4c1cfcd0dbfd9147e0c9f1871bf04b8f58f817236d2b9ea0f9aeabaf7ba6c2959808bbaf436671d4aa858f2ed28eb7f4e457f8958fe [...]
+    "W": "83cd613a62c9c14305fb23aa439346469feb50e33956280a0a83b09706cc3dd665517cd8fe1aca403aece3edf4f7cd197d2bc70f20267c602b908281bb02cc02fc3152ed0b141e88115bdd70673d2b4dfe4b824a8ad69a9076a12c67f640a2f09d9e58b012473b3fd08309f94dc4cf860a90309a155eaea21749433a06aec29afb2dbef7cbccaf94fe7c4670d1b6ccbe9833c265bfcfa40547280693e3c644f0d05b9d1fb218f4af31142822aa0a4557a53ac42dcb2fd657548e46b819c97d408ab0dd1a9bf584453d9f4bbdecf65fd01750f4ab5cf399802cc5a22ebd038c503dbe9c72d3a8642d6336eac47a9e96c479 [...]
+  },
+  {
+    "TEST": 8,
+    "X": "dfc5fb45e1344db2e9a8eb7e152491e81c1fe4ef6c2d017b128e1e432c7c53aa",
+    "Y": "45e3c1e454c8b7311ba9c9a160f1904684d66dd05fb85274a212a6e6bd2582ad",
+    "C1": "4b005935466e335fc0705dc1993364340ba5d4f02994b6cd07a246f73c838e505ec299aeadbbd375d7ddf39f1fb1d8cd35052873859d7d97c41f216dd8846419153d0ff58cfacf32183f8cb6213800d458aa3d14fd05103244472c0927d6c09d97d22a82585bd83714c7049e85d2248a896df3b41f0762d23b0e703c7ebba80e15eae83a8e18dd7fcfd30f2603004cd30ce27efbc44498b1d0ad08f5dffff9b216b7e03492e65dff972253c8f005365d8217efe5ab2359f82e5b5f58e12f5c4924e097fd9927634d0ad9e55a0455f8801f679ca37685b6414b39d0dd0be4a3f04869b0bc05af6eba0aade3fcfbc7deed5 [...]
+    "N": "b097febbee2d6126d7aa77c35a884b7d50004ec54a8db6a9a61e37a6012f29440f5acbb2fcf85d010894d74a271c00163805defd58194fdd87b8c0de780f834a08af7e11d5b56bcfa6862857101c7f094ecd0db2217e93732ba3e7e579347b9507a80cc9594dde5d35df28db3d17acfe6f2693ff07442fdf030d35d279af6a92b380c4b8ea54e5f460499b1528ed1a2008fd0a70b719b73559be8bd06fea1d56702d5b500ea6fbed0c4b39d9913cfd9140bd96e589eeebc0fb479b49a4844105f337346e4d1617e1742a93e1a39880fa9df57fa9a07f697a23cadcbc186ddc7efe02eb4becea30186de84539cd2089c2d2 [...]
+    "H1": "a11ad7496342cb6794ac8757ccf6ccae54585dd9db767f255d6c4a3ddb92f6c559875033955817866ca1fb7e1a12f436398b1faafcc604dba8d281c4d132b6135d82f1bf3672ff4bbc316eb159ff8785a86c35acc90a756f71c38953c3aa2a4b20f9faa1f94e6b6cbc992feb1320d0ee212da3ede5f0dc8bfbb869160166b0e2ce49439a95b694efe788cb7b94c04be37ab089874e4e920b3fe9dde069f99681cd63167cf3e4ce6bdaee4a937a34fcc12e7033a172d95264c959d423d6aea171eeb5fd1a0c8c231b8e6ad411e1d116ec181ed9875a05aae1b1e085ad0aa3d3bd10c143eb9730011c5e8afd95a65797a6f [...]
+    "H2": "5898d4c62f9912b22bec6c7834f8de2fb941b7345b59c038276773de783a23040a211f7c232f7a0854bcc3cc82b664a65383ef28ddbdd753a08df6545695b3fe9afece089ea08722ed00ab5cd14abcdc6841c22679e34f500dac728fc47796240a76edad04f6331a96a8b6c4695dfde001fc58fb4fb7d4c23ba8e388f9ac6eb78090c9ab3c1d806c8eeb004b22987263870385e2f51072e89df97a129173022843fbc4915c7a27c9c905ba3d117ea32740ade9ed4a21725bc61bf4ab5d01dc6961a5a8a9ea5ae1ab81d5b8f2ef2ba680c3de0047a7dbc5ae42121f0e0eb9465d47583797d997effee72196423cce04fb6 [...]
+    "NT": "aa3a57faaa2d2859140344aeeb482e83770b6ea2941c4bec7780251c6bdbd2aa247dedeb19642a8cb55f03ba8d129ea4ef10314f9aa73bedafa112afec5dcf54f90e8319cf8bb80acc148bc34cc8d731237a114d9d088ddc89d419f3180a16793dd927e77258e35260d7885aaf53e7c1338ec3e068bcb8e74e244f29caf01bd3b7da0d08a12128601c353b634bc2a85874d86d2849d69987461a68b670b7d414d7c1a6e0cb1f8aef00e647032b44c993f868b6c4940ee7f0b2c5a4ad07657d9ea889bd90aadca65e845af1a3ca449409939b5df9fbf28036b59c44bdb1d24a458d15976e7905e614fbc779094b6124159 [...]
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000e42d1a8b3e27ec9a8ac34a85d48106cac29dcfff66e22edd100704e788fdb0c8546cd92338ecbfedd2b34e54acd3708fcdb6feb0d30579503388d3c569c25fc0004a1960d8d5cbab0236c2ae4c698994b30292cf315d7ce95c267aed6577bcfa",
+    "BETA": "16b54998cc5ec761bcc08d5881079c383cde2ae6a530a5c56762e5b67f7e652230cf781766813f7ccd1c9f4909d7a8fc075e75ceaa6837d844f7dfaf2d96902b4672cfc966e457aa8b80d3b380896c487e313bfba5f4957104911f1fc5231f830efe64bfb11cf3e8ef1b00b1b287c27cc628c10e9b45597c820586fef6d80598c300e2d4213199ca6801e0ac6d62fbf05561bcf98555ced2db804a1b692f2bc634829778688d0e4449b5aed6a69131d0cd651b04bc61386e501bfb1426d920eec5b5853144c917ecbcf25b99f20d1e72451fb78825c30be663208c67157c277c877b3810cb45ef965ba2ed8bde8c2c0 [...]
+    "GAMMA": "48edab8d0d6109188cbcb641b6feaee80e1f27d033cf6d97ba72f47e61bfaa280a1a26e86613d3960aeb256d8299d17d9289e18c9bd67f14e27097f233928f03a99d8496685d69c33f3c0024ff5b1f2477190f44fb291a1342a0aafa0e5fd07db2772e4a9293584f9dc9cfa7bebb4e91f97f262874d1e970caf15324116c91bf69197387861147fc752e93220147e5e205969a262d3db441d82a2b88db5591c9c33d5d0af2edc746940e2a60d3cbc796d017e06817c3efbd586a389d561897158904fd57087ebd9083c592d34c242b2167f31d94ee424f1711140253af4ba26c5490827ff9a1143d31de6b5fe4449b [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ad52da32497052ca266c500af05b9a386e70dc5f3ba52b72cfc53ee8da01e8409cfeb7b1af4b867157a40af7851ba08e4589dae87ca67d3c9e9fd5e2c16cff6019db50d216086e207ed47086c32ee06ceb8215426499a7eff28c8b3be1bff3225ee367250c91e2180805c0c5a647884b0a6f6cdc650b87e3df5430409f318e12cb140b352cdab653242674c000387ac [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000000b577771c271c0b9c785a7e3ff7c6deefb768b514b56f072855e8574050191f6c09413483aec0c0685efb8f28f6ece637c9e543795effc2ff4e067f5e04704d2686c377dd8793d2246162b19cd2cfd513a470f15207eaeeb7738f49e3364b2f62d8728010d25d7597ae321985b2e6110d61480257a3e0b261cf8e2196c757a7bdba331e2f19755f61e0e444ad11b9a6a66d89d92dbae0dc313bd8a31d9351e8e8605654a0b730dc169cd5d584ccf548f26aea0620ff0cc6c0fb42e5154f230e9ce5869f39c90cdd936e5f3e2e7d6a82 [...]
+    "SIGMA": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085e7c90597027c71d6f5d53daabbf5e6d3356d126c2c383f6f33f5a2ee01946fa8a0376596861bab593b1acc855fd6715d87ecd4f3ce5787c988ee40cbbb5e3da9d5c99fb261bfab2408924e8fd7822e48bc150a9675598db1fb7a87f97e120f5f221da51869b0753d4f2441eaeae79a3c81415fab028bb28e238b3fe5a97b40a4c9802f48d6e64f94fa0a25210ea5 [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000515baaab7d039ff06d2649460fe1485a8e5428286af1f7830b7dd3e04b9547c16293c2f23a4eb936ac92e91466a018ff19dd13206203ee3b3500b3b233119afc7555c1885cef121b9d8e69ee4db2230b5765232c90d3bad039ef35fae2d1440c45644d5f88a23d37e18f03ae8cd95a5da72cc0271ada236bffeccfe0b105938e483e2105effebde2aadda80542ad61f6 [...]
+    "Z": "65585dae43eb99b7de5150b9914dc43a784b6c34faeb22022f6106486f062f6689c5fa507567090c10368b5855c45b00dd05fc55b2ee47a9556dc4efa25cb129073bab51f1b2da19b98aa9468fef5249702e381f7fd14e0e93b8c21dc5cfc205e56ceba66df70a1fedfb6236e4cb509bfd1b0276207ac507467d9ecc12c924b9c83e1ef6e49861703572021308c4eac895b3613e4714770c2753f257f46191dc8808dc4d4339b07723f5cdf84ec296f0928377186dc7e9ade0f7edf554ccd17b92eea3b317042b84346ab23a6c8a179378db865775da794c47af55f665a57cf2d8e44f0e5c7e25ac3e8dfa33ee357cbdf2 [...]
+    "Z1": "1986b5ab8f8a95c31e55a2714f02194d96d45ce5deceda794863569ba3333fda1be9ab228af0c4cc051eed469a12b07c9ae1c50259f66c15c9bad00bca73079ea7112e502689264f73cebe0ad7a8ab0e08c216e8c76c44df008198cbac8f13a34b4e6968703ee5d6b2aa9e530d11db9928d26b4e5adfa65837b64532f7d342a53b1da6977addcb0400522c5341b53f978f71ce899a4cc79be8eae8d0bff4c879e1b07c17abeb10c7182db9c414bc00937ae36a58b83d5b0b457521184303fc6076ee40332b0326e095eb3ec1b71eec6eeb83c4c2f4f2d14c27cc982a9e0a04b0ed50982db8ead3866e34fecfe12614ac9 [...]
+    "T": "17b8578b8d7ca03cbf1833228c6dfcd9ec61f544e217ab83253d14236d12fab83fcb7201c90e761311e87aa5a3453afd4c868ab64b7471005c52ca908df0c79e2ea96dc747952dcdf1005e61d51daa2cf66778f32356ad3e760fc4536f89d5012c9234e1b6e2300e0e45941a6e7926e713c64613c5fa36e2086a09c1b8d38002f2e78459541dbb24b749c49af92f69ff5ce61300d9ed5f1664a9877c2cd3944e23bb240a9dcdb0db9b80b752e6a6667e06c5e9abbf0e010b7b8ad7d249df0d7ab7950b49b5767120ba93999a29e98b5cd0a5f302f0b9511793c620f05e68537ffcc2620737f73c5e6881224e64ecdff05f [...]
+    "V": "1b1d1f642d4b4c36c6cc4f331814daf816ecd39add9c29913966ef5365c8c662ef033a5f787fee075844eddf3508e40a3c8b9d86ee9317ac6b3dd6247aa3f43a9fd2d1750372e5c317f3f594d2951a35b523a5e375af7a5422b268dd00ddb3823a62277bd7d8c9010e7361b76ab66169f21e255c70a558afe71c3ecf4001d5a4aea3f8d41293b8dd5875bf7a57fe6d99e9bed2774dbb2deb4bc6e43d1b75e797dac828ee457bc22049fc6e3b414501799c36fa157083040e9468b60349b582d8d9690fd9f2e618a4bbd81488ff7f551b24383cc1169b961fc7216b67d6f15ed9f84b182cb38d7b8b51cc5a2bb8c88dad83 [...]
+    "W": "222c9e68b90d27405b7d7c03cf09209acc0c45619dcdded0973eeb59dd3e59acbd4d82ed8eda5c691b3e0d1d42e5d036992d94e97271f64eb842a4d69db5ed539e76a704320f536727806f5bd9deace3e4b8f9ef4ad39f133577c3dca745c8d5c65cb04ac7c5b8e3f74fcffb26d0b8fc232e1c19d0e14656e68feccb904b69b77d6dc64772a1b4f5202a6d6c544278f8ed32a825ee1e0a47b425659d989f87be8ea634774af7726bb45846c283768f110d85a5ede797ebde99bfa60232101e345aa883a23b96b62e4bdcb099a1a4028b224d700aaa833e683748e8c85d74710a6c11ed019a870b9a31931fd44efbac3bc5 [...]
+  },
+  {
+    "TEST": 9,
+    "X": "17be01d433d1ecfc37388aad43419a3a06f7ec09ac03e0620e7b8b8cc8f0b834",
+    "Y": "01aa6a91a5d8f713b0c0fa6a2e785b58460eaf1a7ced1aa984a61167dc9d5646",
+    "C1": "20896779f80aaa364005a91088d2ce94cba1193f676d92f05159662e34424ac0a05fa58fa04495f2d473ec04da530ba9b0af164852c30b26917c1e02aa573fcf18679ca3740085fd46dc5610bca4296dd6c91821d3c6f9a82cdafd3bd5514b1649b0eed446ac4f70bb4863c4141ece9cc95d51189f8853b290d3354a3566b1789ec6cc05af20cffef8cb8904b34b88e82338df1a3630b7d040831664f9b050c265e5b4a6b71a463ea9946b0cb063789a7fa4fd89b9ac8e5f8d6ce666fdfb099a81a38a970b040b9231aacaf874e195f079dc8fb5e63fa0e18c59a5425060e2747f91d72f37ee3b78565a75a05eedac473 [...]
+    "N": "b60b7a595385beb256b753e4534f81428d3d729d02b7b0109fcdf5fde34bd9bae41b5130747129911d359520b1506111424dc267f7349dd86a5f509c28358ce21912f00bec7aeb71a3669f2be561ef257f9fce02d511513f00a92cde225097a2af4076093eb9417bb771a994063622874a3fbf7e2e953691399c8fa315a257f5f92e8170b148075456425d8cb111996b80d34e0e20f78bc7fe241f2f3a4886cf76a1cc3530f394d8cc0c50ddd5f8a8de3e9ff23705f65475cf7918dba5c9d6843d7578f732e791add75d9b9e7177c9d78a93ba2cbde603d773e3ae961b5d19db8921c655d13ffc0c123188bc4b4eef8000 [...]
+    "H1": "d1f299de7b95b84cbc4337f942faacd7c9efc70a6e68e1b13f7e907a1026ece4c359265a6b96de6d75eaf974128b9a192b3f8b4d2fa74a1d76ab0eb4fe1bfc93bbf47d06ea551919dc15f554adbe48acd721e6f2deac372d17bb16aedb078ff2d7de86d2adde807ee56158ff6dd5d07f34d1a6f16f37a07bed4a6170c78ea6038717e61a35b9371bc98732cfee76624de378dedecbbd9d3f581778befd885ed264d361c4ed44c7c8eecadb8c5d21bc6f8c00f3cd355885f66d636925bd73e895a4d2e3b77154c90be9f61cb370cd0186d3c05fd4873b5caf5efbf3dd94c9a2175cecec3710a1d1e78cbea7569f20a7920 [...]
+    "H2": "cb236222dee3fd53de32fe71aeac7141817a85f2a0ef49a3113af219eadcbc8776b0f7c1a81634adb1409a1d09892c728667e237474b052f043117737fa7157fca0c05453393134d5930d8a9b3bda5c5708bdeba173688923910bbe72bf0c2aa3eef6bab032d3e570a6c09c0926b0124296163ebe3511d5901f31ecd1776087ec8b8d85c872e22097664ee02f15c98555b88a741968f35aefe30ea8bcc448e329d8efb75072d4fed3f72ec4fb41689277b117df00d00f668356fe9ff793f93ec737353b2e704fd5488cac6d05be4f0760b4debed9703ccffdde9cd551ab823723611cb7a7871fa94663ea7fb0e9ee9284 [...]
+    "NT": "e2d11074958171a031686ab23db36f285b0e23f889cf881e66cfaccbbb4d0800fcc9972dc3469b733f0abf4222ad4981eeb748d23d82d8d2be337315b39bb1d87fb782cb59c3c21b14b05d1ba3e080f21c91be2b6a4986e961c03b405d4ab0626f603a992e450268a857e20acf91a0bc913a1d318240cbd8a4a3562fe0f84028931a63df780e9d16f756de3cb837e30412916c0ae01a5f491de64469b7a29cae5b3030314a60ee75d4aad22e0a8c7c523324e3cf402a865815e2f7bc2d51826dbc13527b9a6702f60416d0a72178e82f0e9e06762bd3fe78d4ccfc167e563ffda9bcf7b3eeac25419704d2c7a5e194eb5 [...]
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000b46f908cee16eadd67527f06618536862ec81a9db8b581bd1c1114560ac508591f9e9f1a0752151b98aba7504642d4b46329829fd7a658cc559463fb2ea528dc9eb16909576dacb871bac3a5fdcfad09b78b60906b515eddf86ca2f9bfdc98d1",
+    "BETA": "083cf3e08335051eedaeee2d48df751d0da680967e5a3a3e205851a9caeac3090851a08402f29a92997cc08bec7190039a619c4f167a6e6130d9e9ced25074d0ce300d8bf8169620bdb3d2f5181c4df19955b5b4bf95e12fda354f5caf749a1990d3dea223e5845bfe71a73ba1d2e37cb24c2c5f47b269d86013222c6b8b882d13ddb67b51f44a057d2435bb273a61ab02a7cff425b0c21b0d867cd1459842bd00c7d1b631288c198d1ab3fdd004b8423cfaae8407b4e8a0217832bef64cad99f38bcbd91040e77c71db4bbdb317d0fb54ea162199208a1592d21999e8ce298d2fbdf04ac3708ed1fdbe5c732706123 [...]
+    "GAMMA": "10bdacd47dd7944c145c39800004364a6c4c301e11b4ac9c7d4cb778511ee922a6770e9ddc52b431e7934664eaa72316b8bdca163e57978ba0dbce8b1f7006eae077c8e614e066e6b2eadd2eebec0da7787685e1148c90f36bd692d9e77fad8760a4e0e5066681c111fec77656e393895b83e56b1d7c26a2b2592d297d9b69c02e2010dd03fb2fd49cc96604806518708c4212315f0a2588befe0f2b65d80dd696d7da1e3218480c7697f1a58e9ba11200f09daf106d92767cfd69e2b1f92c57bc01037eebf5d8a8d4f924b6ad320133c13015c7e31f61fd2861ca06a02af76d21aa5adc0bcc054e1e62da3c82df08 [...]
+    "RHO": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029f54a61a6a869d28713333fc4d0ed9a6a524272273e20bfb5ad86415839ecda3311daed28c5a8fb773953320a52794933878125a5eeda5810a40cb32d9cd6ec94b5b095609dfd06f1952bb8ede14283cf28343a49c7cdc7bc318c73877405a7dd15ad261d77ffc12c24474c9174a8287031d4889de5ef36f0042b403dba42cab68f3d2ae3459490dc83241992dbf601 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000001754e4c7d59e6ac436084a39a9e570c7a06dad40d91dfbd057cd05f70e59c170c3fe95e03099a11bab910c627bbece0b62cf9d95af574341d46f7e584a29514ce4bde8a6e872dd713fc45de062315b3990be054424ae9fb992841da17f6259240421f0ba540817d13aa9e4a9d047e29f2d31f032675e13941336a01babb13f82be41040491add8aeb21c149c05f75b5609b2f213c7c6bc1d2917ae6c8f9c4a37b222b1606d8e83abb6b512a88e6501574ae8200e71cfffd8179f3266ccc027c817c895d8cd9876525782e4329d5db98 [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000522f4f5a4908f6882eb77ffebb5e86d80d3c5d387255b2498a4577db9d66633a56952df02cff1dded75a5ef015487a36d5cd457c0ef08036be4ece253accd9240ff57fbc8a34e3bfef1c7b320bf8120658a44474c1c0487d6e683e60c94b4acd3e1dd844e817f7061de8b8c2779b1da31f8e02b2180a44dee15baeef81fc5fff66fc9fad3563703ee8dd24a49e9808 [...]
+    "TAU": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c3328b300cc84dc33edf5f3b38e54764611c5161bc8aa1df3e03c079dec15744c1fac5db2a461ef3528e6236207ac5f3913ba2348f025ffd07b492f0a9f3083c294ab29af6ccf4ecc7c3ad5bf037c15c5fa3ee12ece31e58d9446c0315fa4d81a8b78ace4d7471deecc2aba6c317fb14cb13a5f3e5908837c0d01d58c5e85c613a6a5c60facd9c342ae311b18487423 [...]
+    "Z": "7b4005c745c103b4dd1b98f606983e626a3d1f0d462d500cb51001a44c915889d60e3523d808ced65a78bdc8e66071cc68fd6332e8c95f084e1e4fa36c4a9ebf5bc47fa39ada0ec6abc541773d0d8cde1af3237986b0783c8d584ea2db185fe84ed76dd586c3a37282f0ba34fb5bb31c85ec513acd7f3b7220df53b7b192c2e1778a323514fef36f2c611be9551c3984502418b86bcaf1c5d41ddebf6e9a2b6414ffc1b03c9925188ee71976dfdb1f9c363fe924c17fe2656b322d2268233ee5322a864faac1f199a3fc83ebfa706e40c1f6b95e08ced1755e33ed5a33b7bd037c17141e6ac78639d8923b7aed5947ed83 [...]
+    "Z1": "02136f8d5a915ec5edd066b0768d970272f802c66f85f977f4d739c29cc461c0d4967019e0fc50802ef85d5d4ee9fb17dcd61fddd246d52768f9f319b470de60f4394e84b0246a1aff7eca03ed1784fb116a47034437cf0a68e3f81d4e2cb0266e41df422e3543c082434795ca57ff53b75958a5deff90d9ff0e6e047dddba4eebde91bd44fa469f5e991d0d4dbd0734709650592a67fe8f29a2e0209cd7edea2bed904bd6247c127d1709d6a46fdb737dcf680433c468984b20909a2716b75986028efc97114d755f38ef7b7ab8b8e078abadcb20edb698d81e0575cee28f661c19fa21cf40b5fd86bc64e2ce7fdd6de [...]
+    "T": "ab6f7f77a96b6c76d4cc65f59633f22edcd2eda6470e326105762dcff30b7e7ef24938914feca44bf25a5f6b60eccb3a3aea98dc77f2cb9016dba19a85f1270771b0ffa4029bd1aa981efd1cfc52751cb68bcbe23c9edf88d8ea0397fcc38e9e2b679c14e2e3ff82763d0eeac58253e33ebe27fc9a1c94b402031c88fa70c898a4c4f75032c2a12b4c583bc65c8bd2589bd03b83cab1bd35fa17b4bcd2e2a95374245089e227a30e82e77433a2eef7e2564e8dd38196d537c48920a5f4186eddb215b7ebc84016d41709c4c0a6e8ac137eeb07445ebb29620c6395c98dd2b1d28e16ed035cbc78d2ac0a07f01d3e3346d8 [...]
+    "V": "3e371fb9af280771379d29c550bd8a696fe68c9f018912606f1754c4d69f536b49933e00c6c6831ec0b04eaa55b991cc9b35e52ade9c54604594910107cda832c25e8454c51844d9efa90b4ebc1fd629154a7c04168af14ce253aa8036ac612f2e51def5f8ca425c9bfc5f284f87e6f2ac29f1997aeadb6d395bbed55e339ce9a8a37d3708f29bed1d991238196166e861f5dc0e1485f6077815bf55634aaf4f1aa46a03f060a132d30d87a057cbb27c22b2e32f2d949fa984d739c56a08807a351052b448009aa6f6e843955385bc08abfe0dee69dac74a5a262cdddf54d1e03ca004465d802a15e4c242533a7b006506 [...]
+    "W": "3b6700fdc4aaa148252da4eb3d7a69724a748b8cd1e315135efd53e598b3adb8b3dba4105fc3d5cb8c85ec2d6732d13879a6b5ec112cee76868b5335ef1d7e78a174f5cbae9bd4d0e825c90ce812bde4ef5a844f6f887667882af251363441a7355cc40c0593100de0765ed74e6d37f35ee4dda5d590d128b04e39d30d78ea0fa11f51f7f9e2877c15d245fe8a4d2b76f522ef7f1e4aec753eb5f669e41687787863d51ceb6089b07b8ea39c26438147497ff2fefd8d7e449d7504db09f456e3e58b16f81dc9dda3c75c9cd79a0e1cfff32bbce34b63d6e0442064ef39f3f85665c10ae56fbb960647d808ef62cf3a31e4 [...]
+  }
+]
\ No newline at end of file
diff --git a/testVectors/bit_commitment/muladd_commit.txt b/testVectors/bit_commitment/muladd_commit.txt
new file mode 100644
index 0000000..702a3b8
--- /dev/null
+++ b/testVectors/bit_commitment/muladd_commit.txt
@@ -0,0 +1,210 @@
+TEST = 0,
+X = 5f9308254d32aadb573c473353c5528943a743aa783fb16aa5c7ddbe682e3808,
+Y = 16812435d861586c37ae05cbcb3bf0b4371edeea9a9c4dad69d6418a01a6f6fe,
+C1 = 183a5f00e6ea0d9fcf5c953e3b52fae8f55066ffb37e5684aff46221720b04b576533344396ec4adba86442d1383718456088e476896e7c28cfe14144872ff5a10d54a73fd060a55d9d868bd7a567a947dbef349262015a3382a597b8aed3668a67cc2b1b5cd00595b5d7e5cf3bcdf48eb8ada88370ec2a5f2e60d7ac5bce2baa3cf2d74e636798fec94a5f17ec25fc9fd455fa986afa3cb1e9a9efe4bb890d5d7c81bf0ae629694f6249b9d925f85c305fead01432a9d4c562f2a4614a3f316bea747fb2378376c083f7e2a11fd9579b72b02db0602ec1173d32f77cd4b751e26188ba46a6fc8237ffda651f7d97a075defd73 [...]
+N = d43e4221edf83f65264e5e99f6f4813db36c78c0583e7f75f85529284d6cb5988fe9a7a7035861eb79773b5ac35241f9745cd4f4afd5371bf2415321afe547c99179fbc090a10a32c79b3775dc95d3b9b1d8c2f008a7c0dc71ced861e4042f443acee53699c84319885216f2138da9a22b84133a10ff9800ea1753c18a0a3b6e7f5f7754fff9f32d434326b2685af3c72f09c09d7bcd9ba23681ae9dfd51766de45a3c7e5ee248c6bd9883483a93be36f170e6283280ea8acd1266ea790a146bae5e9984e2031415f8e4c8a450f962d0d6ea6eab63f2280234698c005bd370d7eadafebe902133a2a80dbf5ea07404f034ba8a7a [...]
+H1 = 1e735bb69b8fd73bcdb8a6ea4f17b805f8f2de6cf19183c6c111a96b266865ee9f44ce0e7857fe44005a440cb5d5694d31dd1d82fe90e75f487c9072b3a50928dbaef437bf1499b8ad3e5dc177d247a288bb4d9b613a74ac310b9ca3306a9ecbecc3bf8de30a105070e6d514fb54c9a387fe4b05d6a47dc308b7696cc6bcb4e9bc1f92ee04406bab610fcd47842dd3b4645e72ee52a8f2b67b3c42ef0815338fd90af14774f3eadd31d5842e872c2872ce73cf99ecd7ec3b3e589a61eb9dcec4d83d56f39198de2ffc739e3aee275a88f5e2014ff9953fd0822fb8eeeed8f561b7156f8d80ad9de3f4e9fd4d1f66a49556e3844 [...]
+H2 = 0aeaca912c3163b88aadfb5cfc1271239d9bb3715bff30055ab67abd32985a4e0cfe54a1df000d5b5411ecf7d814d24d2aaca8f4d2c69434674e21bf7135655cab528945a13bb84c42f49b82409e5c24956dc7493c3e500662aa1fa871bca1cf67e1451a558e4155362f53824c6525dc39baa280562b9a73f351dc0b1346c840de4ff1e59551f65ca92c2235c58736d42c67f8987f7bbe12dae2a44c3dea41d1d5ef1cb78f1d5e47deea1d6ed06e9aa3b008256390d6e61e77d80d728359a0ccc588eeba4159d6ec60c2fc3ffad1cc4540f7034d24dc4383ea5e26950612cd1019c6cb1ede4c92be4e5b3066ea61e3a0e8ca246 [...]
+NT = b5eed17dc8d2b334110128bd1b19e58d97c3286e2505283a9f8d060527e8aa76b08771ca8b16ac020b4e022f85f70422abe7ea8f78a0e066188a2ca022a01af3ab93b7c39ba2558425664ae00a3ac13540b9e73ffd44973fd0ed9030850d242cdbd7c8825ef164eb04de336f3e9565b3b9fedefcf5269f54c68d5d2751bd77142f2ddbe3eda0fb68f2397899515057729b7ef88e7c8a459f88b39c33592cd2d95461185522c90c4d8b0feed1c9d4e1d68b7eff16d0439b2a687b24b242521ef3af8ed11151e3b8d50bddf39d90d0d34ba6a13ddec9b0b1cea034ac6c87d9e550335b8e8268094770d137d022d51122dbaaa403a [...]
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000007ef7f4c16d95a16b92aa8b682f75a8399fd1e019725168c72afabb74299c84adefc342dbe24da8d07686dcb70cccaed25238026a95bc070017f89fe6f0dd170b4ce7058631aa5363656e150fb5c86990bf617c51c4a0c5f0128ced91e0ef71e3,
+BETA = ae5770e961a4ca88a57e94bc567a016b6e9f9ef0b5a48d69ccf9f3c67837101869ee8a341b1ebee667760a5e6ca1c1069b12e5b4fc47622e113d128903ccff8d21e950f6ba93f9900f7199094db703db87a6d13128521d6fd44922a7a8712da1e04e66fa219665ced8dc086b731e6b86427b6ca4265ffb8b3ffa331d18d0166f929e9cda956b8feacc14957508a9375cd66657c74919c9a5ee5fa07b9ddeab68f56eaa9a5968eb76bd2a67c3fefd3325477d7a66feb7384e5b26502b33883b59bdde891114a2fde4ea51888bc00f34e993c068ecb06b7918098a1f187c9ff860bf1e001bf9cb106b68d65eb220e706c0c5d99 [...]
+GAMMA = b331bf40bd06512465ed78511cb96266a25009a0d6241847825ea9d08b24a0f84c9d1b02da730ebece01f31f1b6f40e9082b6acc99d9b56dd31d36776939f6fd34592c1ad807f4f65bc4241df289838e99ec30ef98a0d292d07adc6adc98ba5fe0e9258f3f0ce8f78f0a10406e2958ee53a7b3f61bf4eb17eb598befb5a7afc5ff7c3bd93b2f31d0e86acbcaeacf21f2c94fac7ac1de02dcf132962a35496f052bbae11b8482afffb4372a056599d427e7c91d7e207e002939ccc85a4181979892a61ef887cca5c2a798a840e311625b261465f390cf5501c5282e12ac5d7beb0a0f2c4df7616ce7bac4fc56e33ddcf021da [...]
+RHO = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088ff94fd7a787d062a218eade734687511ee2d0ec1247f9d15f3d693b65e0b4c25385267ab507c8ec24c068948151cf1470d98782f90feb7d40d4a320c839ced1ed83aa18c07083fd3aa93c52f2668c801176523f3d68f075ee8e4ee0fc2cd87ab5f791b8fb2fc6856b247c87101d392ea21d1bc10901b6db73ebfeccf655b1cd0af8c64243823e1146b77f96c897ff27d649e [...]
+RHO1 = 000000000000000000000000000000000000000000000000000000000000000096d80b7fba80da1885faa1fcfb9145f192ad57b1788aacf9884c2c5afd3b48f67f9a8446d35d59b6a28b8f2aa10e7c999d4f69ec4f728522633c61637d4a2bd760e72bc512052e430f4f152b6fdfd010e66fafbe0f24533d153caaadf0f50dcae3521d78c41ecf12ab0a45e43957bd4dfddb3ef01740a9f140c43f7d0eab79c89184f6b0f1578e1c08fc69de5342dec707bf4e2118478cadeb5ded60cfbb4aa152d371a2673eba18683bdc4abee19293a501ba53f790e63a1be4c608b38caddf908b8d94276e5818057f47aae338930f8e56b [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9d348be7bf2ef19edc53f42e6b086b02d71d176441883e5f9774a17bd6dd534b5f8de48a30732e48d1af94f3e3ae0ad57f318ac7d22df8391df812e8a1fafda7d9b4775c921c0e52ea8993af9b7ee6575200dec83b0330e1927bc1ba7b235732655010af824ca491a56a4c3c6386373ab98c76de9d277e44b620bd754c636bd9f66131a6c5d7d2374855aa80c4b3125091 [...]
+TAU = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6642d2ba4dd2527f837daef9458d423c200888fe458e7c2baf9d147d8426fbf8cdc94821b228fb99aa849361527e0e7d6d0962c6f01625e2621895c942133fa84a1d4237f2500924974f3b2464cabc36dff0b0905be46d42416553957a6ddf25224f41b206e04f05286caec182f5afcf4541358eee3d772ca2d52995ebc81249b2c56014187530456ff36634459f7271bed7 [...]
+Z = 21ca08de0a495e808283f324c93831fa9bc9d9fee55986bd98ab7c1ddeea15bf9adbda7a0f9d68c0dcdc6b73c5823ecdedb1b497727402e27bd55a57e3f70b3680af0b4f71f256f4a006f693056957ccabb9bdae8b30d831ead0549e471a311135861beed14e8a1f2c86153b82266d4e067f0883299339ba431bbdbfa7cb062498cbd4e7b9f5d72271cbfd8866c657d75d2a7d29ca6930746d7234b11dbf8ce507941fe55bbeb64580d8814593b6dbd0743dea3cb3e1269410a2be56709cc8846323078f1b3de4a7179c7cd549db940a4494d9f15438890262458715feb4fd8b21be659b85a0886a1407aa168b16900f0f18f3b3 [...]
+Z1 = 81365829712348abcde8cb118871f9488bf7368a1a89287176e3d5a587215ac310027ecb4bf3af907ca1f4ab95d5b3636df5a3e41d7be4914cf4bd73c47e04ff4a4d05add22e5c80da9803c92a2ec54df5cc958168e9da9b9d99b5f7beb4bfd9dfc948c897e663beb95fdcb6865c81fa2c60555fba3710c2545e84b670f39cb622025c5fe24380dd03fdba46cc5cd6c9de907d8ee32e555bf5098c32c7731784a131f73427b8f01d5ef8329232bd52b28e435159c9508d19e0ff2d768b8524e07dc848acbae13ce3eac9ccc4240ff86173af29485b47a29cae5374fc0230ca06cc0d22b9b0129a541e408802517779b49dcbf06 [...]
+T = 07030ce5bc4d46d923bdb7e5f7045f09911563b520b51b173718c78453dc2a28b3ec3408d13457be2e332d6e4c85c8f0e9e5f47dc8027072ae45f83cc58f45a1f3a9a28b6d8ccefd8c0256fa0fd9194e8a1c8cdee3999ee6ad6a445ef990c4ac8ecbea3eb6eb6eb0ea70b0f221879c0fc036e8365461c7294157b10e147666585bf606a209a12008e58eb89e01075780d481c5e9cf77168f490ed58b4974bd58c7716d5cadcbf66392aa98e0e527738341ca7a2efb5d20b28354a19c85622994976abbf7143c3d853eec590d5f4688bd468d14d3eb13fca30ccff9a93ca11229720782e7e4f2e36c4198c2045b2377508c6deb22 [...]
+V = 4214c7bd84e983e59c1c7e4e1f8ff6cee3bcf7a0b4950afc1d14887d4a173a5f92eeea2e28a5c0123711f0c7250db344967d521cfe28fdf875a578ceba696f50100c00ade02ccd7f4b7aabfa5e181999f7afe9377f527e7d051c81e63a2f66fc11f4852554dc7368d6e897a814cee2d085971395c593ab0d5bf156e05e4193173e0e47b8ee5974c9c6bb1dd703cdfd15ca2a545b93a28beffde418e155c0327580be76aca27b6b86a6a27c481502f49fa7e3d29d32033e1b2721dd5ba8c887d878088a48d4ed8a3cc97a10bcb6973074784f202658e68ebcb44bebfd7950b17212b7dc5237421bb753219eb3a59d5cd81caf7256 [...]
+W = 5840782a0ed9bd3bfc937a60ce96a4e8ac2c6fc46e212082b78fd773a7701bf7023e6eb84ec8dc2f4775f940efe84a8bdabd94ab493caac89826af257d68f1c14da6fe58a71e43a3ca553aa189a8803567dbd6484eba813ead4d687c69f65bec4be995757bd7ab5ce84dd3ab1bde8b76236a4170e0d8b6120343277940dd6630bc5b4286dafb7586ec51562787c3604fea7c4903fab9254c02a2f5dedaa02c840bd2a5cfd6d56a93c5a9ccdb92a27c28588372c0304a03c8c39556fc5d90dd8052ae8db2dc9c18c3479ee169514dd20d51c912591e2c6b344f57e1aa0239363a4092423ebe16282a8276c21e2a8a859db7e37858 [...]
+
+TEST = 1,
+X = fbd1e5436ca13df885a7e68cc7253cc15df9735a80207d37f548525b2c3be338,
+Y = 97df40188b8468f743ed5c69f39c0e207926aeed0dd0a28aa8d23c687fc268dc,
+C1 = 661a0bd0456f5070639013456c40f0e641bee8f7d6a85370cdb7c7930538152de2302e9ae9099d10461cf3e4f2a59a47e089fc21fdc61f207cb602cf8772edc21f3c2b4ac0a97708b3f74346ab8d8ccfb4e4c63f48a436f3c1b11990e3b4b78e96b37145ad99c0e63ff4281debdf385179ddd4f1efae4d603a1653afacb7a9ad0670620a484965334eae133392da5fe527c519b07f275fda50e94eb57312f2d54d3a539009224aa1c4c54cd2b89102e90bd96102a9c09d08f1960507a067a2eb1d5e8adddf7cd466c47c79573de81a362fe12911b1d76643e554bf84a4dfdb49af30a9a10991da159b9c8f2688ff2ce6c457ee6 [...]
+N = c9d099d16c297ace1b005ec4a1e4179a08b73d3092f153f0624fc9dad82c9a7f0aa57f7151c65ee250871e0ccb197333003100865092de56997c3e3bc76cf4f0dbe56e4f9b2fc45bb886362ab5e84974da18f2cf3530396b71a56a340449d3c1b8204cc1724af95f1199e3b2e8fb4a9f2e36be61ce8262de036d2fd9e6a6cc09cd03392a634eaefa27d90ddb8d703962559388ec130050d107c22bfc18db1f5a6f22742ae9d2a7a8a42f60fcdb8b17556ad0158201263b341787a871ab66fdd19b14f895352f6d2ddda4b465cf45e52dc567533c903a80adf6799c27cac3a0f9ace099eb8cd9c0e141fde11876f03318c66c53b7 [...]
+H1 = 9ddc4965e3afa1b2531b29b8f46d667da6a4d03544305fee194788ff1955db88a14cef4da60084060dd5a7f0d05a8d5ad937c118e9b3d30004738eee6410e622b49fc0b1a2f818e8186afb337129817573442cc1bc6b8fe60140359e4a468ddea64abb9058236a0633e7eb72cbe25ee83d5033f5784372ae519aa6717c38edbfe1b3f1480ab4d06e8e6395eaf0ff5566857ffb2f1be8765140d6e1586e215030fa3f54b87aff0490b6e95495c4170ed5fa1358720e5946c6d0b1dcff399cecd335db1f50c26075beb8f92b66c0f467b144e18290564e00e7ce6d346d0789434ab8bd86821d1a231b1e38240e18db659a471580e [...]
+H2 = 71e4408aa28a6e6604495a1b2c5a1c2509192d86a6af56904fe4fcb50b69152377411ba595845eb437742c625650e25a9b53227b469c52c121b795c1c1e18ba05afa59435a6938a320f8bf5c625dd73a5671800250072451fba8d09f0d98879bf621ed9fc2ee2c67a02e7bd3acc9e1db54e589d2eb012910db1c0b8936300d3c81a2d26a4b5a4f4d2ef15a5ea31ce57a9fef67b488e1b919024f07e9910aeb31aa9cc1898a6d16e310ff235adef38b3f0b768bddf522a108f615f0aa08f64c14c8bca78c97ac0937601d31739ed20cabf2ed3ce78a632b80b0b12ec30c0bcc4c75399f2bfac301018b44ce889c2c80944463ee4 [...]
+NT = c1b8aab9caaf1f9021fcd135ef022089792684e7cdb1467ff522e46713609e7ebb633f19ad52e597f7dbdb59f6684f204f368b7104116a1fd8eabdc9ef7eb4b64867ad1f007f74bc57f2fb77b0b9b518af7df355e7a5d99217df442358543b76a51798e8ef194437fb4b58378943cc812942805a0b3d30eccae13fb56ea3500a781549d1d6fbd0b2ac57d63aedaa05987298201d8434b6e51b3c0e75bbd7eeb3cfbd4f79d28692110738954720784d269fabf4d4280d61e4fb8581803dd75e1be888d29d8ca419b68ea9850919c0d5563104c084f9fe0730b496b70612aa131b20b951ea8eb61c30b186a684698f22bf09d2b02 [...]
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000002c919791629cf6cf8168f163f8efa13f91ea6e660313729bcb4dc3b839e8f509306ff499b8bf6cb2433d107aeab8a088aa4e4a6f49885fe430cfc4daace6c0d542039cdbc98572a844157f7fadf09ad2c576a5bea9a80d0b886ce5fbe80efd54,
+BETA = c5753de187f5a2b929afb3df6230f4e70d7492ecd8c700f1ae51aec6dee1fd85915f68d21334e5fd57dd67571e27a42f6b83c431ffa702538293f744a552ecd04b0ec3c524d2d82758756b1b44819634a615d7949a5dc59a358456865108bcf046c205d85402252b20acac9b03e5f28ff95773c3c9ac103e8f60ae46adbbc28138cd0545d52ddf71006573784c2a2d33fcac82defb6acec680edeff93d06daa32e33e7eaf03b2c13890ed3d09d7a54bc6d83bb4a6e81bd21626ca82142f6738f74b98ed6a8a18c3580dfd8100f2ed2376f3cf1e9451d677a2dbfb3940f9ac271d3a427a1da451e5e3bbf39175e4ee22c3ef8c [...]
+GAMMA = 94b091c4daa021e3ad5683dd9b25b13bc7fbadcb0f6b275daaa943f0afa76baa55658060c39e86427efc56b79f6f47bb6ab68b6bbdfce9cf5e125c2ef00e4c3f687257557093d293c90dd39aab32270b5ee77a052a1e690e5b8018922b7db6235a56b15dba7ae3ad57afe9ecb32ae045103ab50a6c9a5f7fdae9fe5b835ff732bcfd59190bf5da3c9c5a864574396af8c7b3317c530bf4a3978680c7fdebecdcbd07dbfba5dc980b55f1455f21fdd2a0b0abba680ac4d77e5cf125078d4558d21068d22f87a0e475f5889086842188bb27257b27e776858361ce2885d1d2e2986daffdb5efca7fa6426f96f17d2d107799c9 [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aaac8eca4561f4c5ff3f2c80e823cb8641d32e67037b01a6a1bed6f424ab9edb20d73e632e30fa3eca02ecad48ce0a580e4138a8fae0db855afb0815214e302c34791d9cd27357cb80a0d5c01387595dcef2353f46793d72bc43580878c5e9db8d2ae059d09db5169c0b399f1cf5b17667dde4519ec4398f90f93d1b688e046a56f6a050cf32f99ee2669ce500c0e033f627a [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000000a490a7a2944db47f0854df23e46b04bcb03fc2406f8c358815f1a12add4a21963c5e32837085d44f68da44af2ec27797d76915668400fb321be5a65b389ea238ae3b3b59d47e3b8357f6fd9f8171520d04387c31f533e3e728397e60ace96b253d8e2788adba0fa991427a9572481525eb628a28c91fa14ac9cce433e6000fb0b3a0b2a4ba94f7b164f2badb553b4e10b24cd30bd2920a93ccd2bceb0e4b690761db0e1bf5f70c3087a3133c5b0a16bc26bcdbe10befd4c3093cdb569d2aaf3857b38dc94bccaff8a18273e1d64e0dfe97dc [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b5d141bb2d2cf714de96a41ff536ee13609ecca5f4fb589989e5a4413df0161f6b8749ea296c259c348f1841fa7ad4392a1654eb69974dae235920056339c634f66a1c8ba1d6256e38e7713f866455fc22e3999b8bf6b0dabbb695aa99c5ea0f9fc667b09b42e31ae6e4bf7422c415227eb646b76ee88f0e8cec1faabaa254e86cf509f073017338a18029ba3258a2ae630 [...]
+TAU = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744d445814322bdeb28b1fcc9cec0daf2349cb3657490e2dfda03eee7f6c1342835577e116031f9cb064861cd7b7c5a4d9499aa3512ae43216b2f8ccff4a2babd1bb1925992c34500cff30318ca6722d4dbd3b65f9979103250319a28c1dfb11d69a4513966c4f1ad2b692474067bef2622e5d37a059cff1451c43432b3516327f83ca3e644e011dd7cc78acd494282aa9dcff [...]
+Z = 4d8e0716665aa7a6b33a2848bda0a954954caa22c632cebb2b51017612398d03bd90396f0c5ca26148b97a09911fb2833fc3eb4771c7b42b6b817df4a04db3f93450b09663315ee28a29954e65258db15cf9000870f0c1982d98cbdf5c11cc806d0357fb047638a039e59f649584c6be9127544e272ccebcb1e837cf90993b4046f5df0f56658b9a5fe0d3ff2cde9a00b1b98f464e28b69639d385376debd0b7c2befd75eebdee9bb64993fe029e6c23d789c97b84b35aae3dd5df25bc85699bca9501e1cec1c564d328617b22d22c7ecfbcaf719aa68e4f7ba978e2e350da565b5538870824e880a8a905de12a05a3389d5d099 [...]
+Z1 = 08b1c344f0599890d10d229a10084a3ac048bd7b5273c8591b7b1ed72719d1ccf6172e780370c48ce76ac1f1a0242b93fb57f09df06d4be0208be23730f831d0938a4fda656a955af76feba82763e9e7e1c982990079f5584538bffecb4a6670ff7d1e84e4ef74cb9792801f9e16cd2a6c374770ca61ee396fa9828eecdf73b1141cd9f2eb3cefedf871082e91ff88f7b5887e29c798afd0ce1fa7f84d2cecd9997e9c009a8c18e2b361bb5e6814a3f5b3840e962c408cc0022f65580b62d6828486d22db7ea6dee31381e19d0214fad591ff3a084112ace1533de4892bff6a4641633e226a06f85ff9f4edf9b3a2d4d3fcc676 [...]
+T = 184c2af99f9371d2de7e29974a02016c5eee3c965e225ec3ff7cdb7008e93105cf1eb3b1338e2c58d43282777f13880b0fe0f52aa350b53ef867310780ba6809611e70b883e9160e7581747a0bfb0f2fe7b9cafc02050c4b49e46ba4edc1c75e9a3b78a314f47475d0ef9c0a6d140b4eb567a0e9ed22eef7435a9d91f5ab50d987ef77ecc3a02b2d28de648632344727bce142e1b91614e48c58fdd9a5f097cad11511b38bfc789480ffd2ebd53d33c0f27a2c16001921847a3c02caec07a52809f4c54ea1df2bad1ce824682ae398feaac35a03850dd77643593d52036fa069fdc711a2a9470741ccd0ba62c0bec27d9e77a0ab [...]
+V = 3d89c6e87b84e69d3979f4177fa3177a4958e52a52f1811faa1845bc5ec4264e085ba5799eeac897b6ad56c5f04365d1f56932c6aa4f45a87f3035ca99849e424e24d8a076c9edef0629af056a66a8b8836b8821aa8397c92e60c55069acae85cb13aa424929cc5081d369dcbe3024c409c6edd56561159be1f02626c68af63c12b3d8c51019166233fce605cfd593adc98015d13d8d33156dcce36a2b280c6af7c488e54cca8ffde5cf4fb3a23264b195322360b303166ce3500753788e03b701dcd8c973459c31ce5b3100fe28f14b967fef7d43ddffee9f158b1da851c8e61ccf1f66504b8d3606ba96fe10be7d8ee3026242 [...]
+W = 2e84c62a21c40a5087dc87b35328d6ffc498ae64ce39eb8b95241069be3a50c58610f63fa4fe0c8c0308f8f4ea53e5b20bfa13897ce54e88760f6db621979df56983cbac078804331f05f327acf3150facb1534d7c55d04444eec00e04d59cb94656ab343e18a71d1ea56933031a6141814d20227980f1f9833f70bd9c73e0c5be30b2cad1ff320f33eb400b1117154ec043257dd7055df2c40803d39a5cab1f2157662e9e1206c0842005cd16995a2e248aeaddd36c7a9346b2e854a914c147017b1c99011114fd78873317091792abe2bcc93a8a8f2e2b28ee78861eec8e3c6e68a82cde69445003e799dff070240b85e75793 [...]
+
+TEST = 2,
+X = 28b555904421644ee5f8364fe647a7d9e4b58815b69925cf1df774c735b36012,
+Y = 90f78545c8cdae324275b7c37f33e83a076cd7939761d4e68c9dfaa20100a587,
+C1 = 027000b2802e324b7101a618288006587d17734ac5394163825343f74112439b95d555962c06ab5c69e0396a5cf1836e80525224ad22d20b42f2e7eea813b15b04e8bad300cb923e178627e596d7eec206e19f50c32f79b29fa37b11663da7ca00c78d1f7d80c3cf69b115afd0224cb08e3ef4674b304bba0423b7625d0b0fccaeaf2e92ce424764d99ba0f70e8d314bee78329b2b4598b498ab46f5d2a8edbb122f5739d07cab4acc90a50261a05f0dfecdbdbb3e4581d24b79e4b104ab32a5d51ddb0109342e8bf9285b5270a23ee47fd3dc8add0e9e63a29bf10eb4bbdae6faecc6a2be9172dfd269d2e38a5833e06b1ce0c [...]
+N = aa44996981ac935691b0a11d0cbaba5fa268e1bacb851027cf21456ef68c96ed8ad0d0424c73a729a27f7a8c083f3bc33d54c4d96b24bad82f4e58988db2ef07bf233dcd44e7da812c98b94e79694fa80eaa7efec909dbe40ac96a5b6ed45c15b15b48f2cdd5d7560faae3950df5b22133070082dbbf4cddf97ba0b8c2dad5f4ee5a713aa04b2a06aae3374d6b570ea640164f14c5fd653f212760f1befeeb6ec6a13a734c7014d6d273347cc2b451d5226042ba7b66885875c432f98f4c52b4dec5c2ba03c647f6466d633da8f1719539bf120807c596cb146243a82fc1ce6454931d1f54a651cd4eee8340ee9894d8c5f23046 [...]
+H1 = 6f2f5ab0585980fb3fcba5e889f728c30f31d12cb96debbb465e122d3f2bc61611e4025cdee5411ed8c93221992cfae22cd707babc00e4f5f328749612bf56ea97d0fde9aeb914523f08f997929992296d6d1add36f3c65749bb1dd46069b9f50bf355a68b06b99a8785c641dc197be71720cbb8f86dce4fc9382ff3c4b81fdc55c9b42bb764abaece60c763aaff7285ee6776b3c8a7686461b183360e8ee4d6be69ddb2f5b8c5ecca95b57fe79d6fc36e28fa48a023fe922030ad2f6357eeeb2ea9a83e77222dca137790c614d54be0a40ae9152becb0b00e995302eb7aa98d940a7d5945471ae25e760c2df3ad6ed67887948 [...]
+H2 = d1c4e80f01fbb3c1febc0d7985aa6924c862867a57bf482a04ab7c9d7f74800ef03ed7833df45f0541cac623daf12f81133e65ec981af6a5a6f95a995ce945e3183ed5dad4b5361832c18df825b5d249b37df12ec8ec4d67285dd1e5e623fce6dfbd2236f908c70114aa2678f025a97dbdc0152d6dc32f34219bc596c27270ddc72be675d2421839192ef39074809967bb54c0d32123e8205f48864a0197a51e305b10d3b26915f561f710b97937ce3a8b7ad57415ec5b59a952db7dd0a1784a5745a8da39ea35c748e0cb41bd9efa184658a947ca3404aaa4c0a799a25b56a3a3ba69249532345ff43bc36b394a534cd1a8cf7 [...]
+NT = dfbdfc2a4784522a0bcd93a9925e2d185ec9af22e3c76af9e3a55552ef2d22e01c3a9e5155420383305ae63787a6451f91d2ee741c24a695272fa1f3b7ed6830d7c9f519fe3afefd97b956029c9bb781ea3efe49bc9cfd911dd132f7b1c12d9002fe73782c148b299144b664200246b3a5336b46768afe63e8b508efb0aeb71022e27307663d1ff104865310e59edeb9220630561530a7de5e3c5a74abaa4549b80d37e851c8affc44eb1024387c63a7854346ba6cf9c9305d04350b93db8cde33c3260789feff3b3c4d55cd50216e4473db4fd83d138e6bf25a9d609f010769895dd1844fdaed0cca3a773ecb734a6687ec074 [...]
+ALPHA = 000000000000000000000000000000000000000000000000000000000000000016ccdb75210f4b16b9b96aafef37167634345fd6c608bb4c90732c054827df41b940641098ee354e6ab1d123d3a8a645e3843387087278b56122f4d5e42523b4724f00f8068bbe0e781a5c6ae0e2301ed4a20756e0b4449f67912df318315c33,
+BETA = 5f01bbf6a170296842db2465dabd1401f6cc4db22f60d0e7fb13d998af73b424377d43bd99b3da0e7f051e3bc99fc1517890051a127027dac429bcaeb28bf20fd446a116ef266018ad53fa897f0f3f13b329dfb4b9d5673c4619a20178b725515f21b84080583e7de9e37c70ad58104ef31be0290eb60dd41b52b9eabaf8f16d81106c7fb7674ec8f7bfc93993b1d65569d1353a851c8ff125f88789cc766b413dc7e60429db09bdd64493cc1a669d60f24ea2197312172e045330b7d0b1cb1db20ad1da1880a82fb1a854810fab4514c8d2d2afd3db458dddbd1d02385c70d9a77dc4f60b090403070b548f76177ecac493b [...]
+GAMMA = 1cca57259f2a0097cef2cf0aae9c73eb2a451879e6add80cb71f0d36cc2076d054232d5c3cfeae16ab061700dc6d2579e6436d9edced93bcdacae6d6f39d4f2e5a9107857fbfbc3aebe92ac01ca255d50428f994a903a6e13e22b8b3463504bf914d0e04ea7fd04bfe5448b4c363aa617e54905a195c797c7773325a6579cf1c498bfaa8443d5c7e0568d3024b1628c493cc36d187e442d73b036a0bf9da6a45c2797485802889c3531fa4edf2b80e72bafd4511c0c57577f82a543f7f949b7bd72d090c4312904eb4aa53e8a13614cf34544cad36c7f24ac7df7715527e1c9a97ceaed8625f1a17bc65cfba21bf0f24daed [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a159462814ef1416419ffcfe107780677d4cba64085f276388133d2b391eace1076e4515cdd1698dadc5ae29f6581f336bf399e64f56dc0cd5385dadb48335d7f8e017ba1dbda780487519f794fa4c6fe8760eda3f54b3474b887d58ebc001cbb142c63c1e8bc9aa5a5a508b060fe2f8c93677197c166120c5d3b8b4e2ceb1406b55f731b11f09723124bbff5fccab5f2f136 [...]
+RHO1 = 0000000000000000000000000000000000000000000000000000000000000000a274e6e5a3b564e9e217bed03ceee3898e9772f7506f79cae15343149e620952abb4e62b7a957160892f3f8ae67682e8de556ddac85b242761357c444126d7f5fb6147cf8636a66944f03f48cbc8898f8abe2dfe4572ff22acacd81d164278b654d28ab72208bf07ac6b268fe143ee0f59d8abdf18a04e7c1e50b1b8a8b2ed4dbcef9dcec179e0147fc9dda231110a041f142844ed37ef979be5cca80a7fb279e18399950e0d3b5b3c959a6080b5e1e361438b7bebcac9f8d26f722f2d21a4191031bbc6e2ae87a54226396a8bf6b21fa497c [...]
+SIGMA = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038e3a58fc7654ba2f1e3b60c9c4fbc66b2266b48f12897c518f7237b1eea551630d283dbd93bdba08833015cd2c014624fa2f44bff6b8424e00faccc44cf6f0aebdcdea28350c3c13455da96188f95a431556c2663e4e1171ecb304b3758bc6b2a980ece1442a39567221e843552058be5c8dfe3e110297ae7fc54bf64284dee595da1727b98b875047554813d62bca591c0 [...]
+TAU = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ef7f3900e15cfde6c3ffb6b45e9b933f5c17be4892f3020c1ac824bd481606df8c6bf067405a07037d23ca20ac0aa77d9d32e39121ccaa64521db43e6be56bd601da537cfece651772b2ffa7b93140d0caa21bdaee539e65bd79864a71649fd8bbb99366966a21d0733988c3fc462c1df153839028c8ffa9683f4632367aa2887dc5501dc6754bb863e7d405f175af8af659 [...]
+Z = 8f0e63657977ab477447665ba3ce4b5981a5181896496c594f5c154cf2b875e0a8da821096159229d1378d93c43bb47d38690f0bbf2fc715daf568a0b1a20945c14d1ee045bd85a42e91b70312f88c5b8eaeb613c6978d26b2fc4b9783489d95089ad9e1bc6e5c554b1f06bdbc464f0bad77f4a6a4aa183546c34e4b942020a486810236d82394ee05376abc5bda222e54bdd6ef7081629b45aa7c5e8a7248ef1103d9a081f2d65c339f38adddadd2df9993cf52004922602b64d5eb5a73e777fca6e1cfc4dbde4846068a935c5ed7dd8c30cb8876ef9eea7d076b80689e9f6cf33441e9c9c0e1aa960a8bf238136e1486fcd907 [...]
+Z1 = 44981dc6bae7851273ab0732085f8dda7ff4560ddd07ee96b8c95982668f582bef057c56b6b7c29992f2e7de15b96bf3a45e362eb5ca8be23444c6edc6f062198536d37fa8b9af897eba083a41b6b103820e1768782c9f67903f5f55857534e36de0516dd80aae41ff1c51b21d024314c2d0d991b59235e5afcb31a283621df6befc8d3c15b85c764bfa5032640c84a4e1d456bd57732010fdc9ce7686159757594092adb942941ddb06783f837aa181398ca32823bea8bddb595b3b9ae6e43b8a138d813ffe57cf20f0abe5499f0eb27bf0134572e656dd8ec71f90550f5f0174379c1e77565d6b77593e08455242035072d63 [...]
+T = 91850989c37c500887cdf1e68c9e976f6f0f5b1a3fc7b02992e594a1395eeae8b371c4e301abb89a9c707fdd6b979c421a6c82c81ebcbea50a37be7a975dca0af8c643a0242fad8cac1c14c14132f3f309589d426b5397050f2557b2ccb2ab09c8832a576dd12153186fe029360825e1b12b4cb7aaa6ee26a6c46ca5e982eb150bc20a1472373f28dea9ebd631e040dc776d31429a07f075220da81382451ad3dccb781ca1fde97b41f24484d59d5d37a908979f5063e244f4f1c89e41bfbb15be92b8652057586922c58981f39d2f80c917df710a365341a48c5cc53becf8c3a179e627313bfe4aa732a1704eca5449babb1258 [...]
+V = 0d4f43b94b5428ba003b07e47b2cac7c205ad706f16edf67855d26169193e9a0ea4d2192b9d1070fbaba227c3e4898725d5df9f67f6ab1dab155c3cfd996e50dba84b4e1adc2a8b2b7d59d003d629deb8038652f4a8f3b26357a1a02e1b05438a04ead43454085f027cd9de8c26dd153f1e3f816a8fd91a2fb1b7475763a95c663615815a485a21d61e5f4cb631ab2ca390ab3d55c9f2a2554b3b19ee439603160992600280e0e3a68532573d798dbd7598f6d449f9e57b407ec41e80e2af8d4ed258bca6880080b656143efebf80f39102034efd9278f871c0974ed3f81ac3a6756584f4f6b39d145c4a149a98d5a30b1099f53 [...]
+W = 88d42e57f2c6dd443cbd2bc081a3c293193bd2c93cb5d869616f1ef989180c54bacf067178b38bcdee6606dbbc67f8ea5ae2b101802e063970ce0da07a1a7377b05661b09c5983bc14d9ac3ef9e6362cb0f5bced0caace4593a435b54602c6ec2d3b58f089102d9792eb9c13f95a663d66e86cc3cf8ed2d1fc598e0245109cf4666c78ea1e99b0b9b9a8f7c29c42d58e307996a428e1db4138db537e1db28ea9ec5436f9d3e6018c8334dd533bb9264428409500f74ac78c7fc56dba9a0444fb471c2baffb47368397d914a30f8435e70b463e53ab54cf102de1837bfadd9e81056b003ea43ec2b688ec22ccbb516e9c05723401 [...]
+
+TEST = 3,
+X = d502b329663139b5778486e765cf5bb3fe03caa2bd84cb1d28cdc0555ad3588a,
+Y = eeca2075d0109deb1b309462953508880378827db81d5153847d67b8de53ce02,
+C1 = 3cf03a12596e4073f26ca9e812be22b18481292a79557f396829cf509697b44eeb5b087d2a8ede08f257d66ae438af6b3a487dd8789863fbb61b959be9fc8d20f510ef82fa42b9cbca0efcf68c4907e1bd6822efbb895d6b558dc706dc0bdeb05f21f3034980f57c3cecb5a0f0241022f9f86b9e4cc2c7cb5c0c575336d28b5f61c134bf5e931136e07c02dad46f1f786dec8979fa97b25b94153828eaadd6675fbc478f77fa9df82df3347319514e3f643baf4616a9dd0fd57eabd79910570b874474a0f7f5c0a59a54aafa285746cf2b6ec1a1e1dc41b7b9f392ef26d1336fe0d3fce54d6c1fbc325d3f4de35cda7c2625107 [...]
+N = 98e00c156e8fd8b1ce96aa2199bfda06427652c37d55d8c9a8b4b7cd25e1d446f010abc9115e972c334e24a924c6f16a49642c1328cf915531c7949f5a493cdeab66c144b34316d88488a44673767f65303753031835865739499a0ba92b5b6e83f342697bccc4da8115c8a95381d1bed11a895ceab3e7e43d29f76c406da28e5038ab6cd6939749afe2e2b3e06ce2229f644a5002c0e44197a6f9be06379c404c29239c6f030170a53ce13a9cba1457e4b2d1e931a1f4c1a40d97ce2888345351d0bf071f9879ec3db559df0ffc50c1d3e837dcb158297aa9620fb0600982a94dfbd0ab624014c435c2dee4009a6f2d5aba1a84 [...]
+H1 = 205c3cbff693616b8b72e378cc02b2f713584febcaad23b6a83ba74b1923d22e3b08dd3c3ac400a13aeb208f027dc906730292a675c73a02bc2b11cf46cd2b89c5c288b670b2bb29236fc4650322d7d94a1e882b0f07e014750fdb5ce7236b920922f1dbc8c6b175bcb8779e8e2b63dad216f610aaad32b4e03523275301126875988ee86ef6740fb29baab9a8d02e659e88b34e0c868d4577c5cb4ddef3ca1d319f3e3245fb522a6d7845c32a3935cd5b1954dd1db11d76f703b9f141fb8a7111ff0450b310ea6ce95f91f2426d08b6696cb111a38aeb38bf1818efbdc80032e06b44b56aabb959caaebc88992d5fa4c6b0749 [...]
+H2 = 071487dd30c991fe42c0a22f286cb78fa0745890a30dc010ce8fa440b0ed650395bd77fcf2b69d9b811be32ad0ac1ce4756f79ae75d8a2b3b25400dfac86a7907f07ffbd114776137d2f3889911c3ff63560826dd26a8f3a20803892b26a627c014e072c9ecae1d304b54cf6559216062c0ae0335647ae62fbf29acd7f6858d091dc8bdf10426c1384a5d0b87a780865f4ccfe7ea3486a31c4c2cb2efe0508e5c77210a656f2a1ac65ffe93abf8ddcffc1349813988b688429aa01d0c939d165b7441cb151c9bb9f9dc843e3d3f5c10b7ebcbd3df3d30fef288575cd094ae122f0b0a6d17b2942d9e045da66178ac775e0c239a [...]
+NT = a86824e86c82674f33904dbdcb24e39d2464f3f906a90702ae2af8f71be38e87cb974493dbdfc40ec9477fde12be9f9c3d8ce49b31a9a55e8e7b56909b263106025cacbb8d454375f0078689f2c7df41e6c0a92a10aee5e53718ff1ed4ce08ac3eeef87d42e41e485f457720dd0173bea2d6aec0c6aa0046965e09c755244bf365c92f884dc2c38c415e041fda53b0226147ba3d8ded0b8d1cfb36f4aad7b98cf24f46dcbc6c83e9f40aa44d50c3c0cabc27d4c52a0c6e6fcc4736303bb65c5149a7a263a4524abdb512407a5a84267ee90412aef31d81251e20ed3735ce6f3ad0051138b21f58d95dc0bfa1b73b5b5adae3548 [...]
+ALPHA = 000000000000000000000000000000000000000000000000000000000000000063bd86031ee2055d7a3790143591ded8a7e6abb29102df2bc8620b833eb0cc1fa89f8d8b65166d27891c153e6ff29a2bdd80a65547c594e26718ea696ccdd975edea76facf0cefbc18d4c3210a4bd51c0ad3a0d3ff8cee0fbe4ed411721790ef,
+BETA = 2da8a0a7d79262859db7580d172a21436afa664c6ca1a32adf3c877acb9cfee0d5e25aaf49a94f1078fad2343373ee61d8226cba00458d88abd687c6d86440d5673350bf79b251804f5d92f18a6956ef7648364738abf7770ee6fbd33905131c91c5f240d322bbcd0a49072587f8bddd3595c30f58e3a00134fab00895a8b6341b2f3935ffee824ad6cc40048277fa2b105e7aadf85a53b74a3f6d18ecb7b575ada015cefc39c5f5c625bcfd0e13d94161159f0149b195e85de14e71e1109361174b1df8ca2ef515e429caaad73aba803ae1701740469b83b96e732dc14271123dc872a59fd21c3b8a86cf3f994e053afccb1 [...]
+GAMMA = 030c769cacb240bb5f646794c30bcb79ce51f1c44695d555cd83f8dabb40de911df577d66764c007c9d341a9cf03ee182530f345fda5b7f94dd1a1d72dee6d74aa6d6c8207cd782a715439474e335d1012f7760e20e335e4ec0d95ba167e43709d70d94872565967ba03abb396ace02a722ec56fbdf1b2efe0680f96675bf60723c641d05f154eb623a2dec098edeef7852f97448085932eb96dbb74f3e9a9c2e49fae062ee0235566c2945023e785d516054bf69d3dc8b2e457d92793943413cd5c13ee0a3d3e459de3be001f366d805a95829427e6b9380473362a8d86c1077a372cc180acaa08374fd2e7c2f4bcdd37df [...]
+RHO = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000857d07980e64eb85b9b5291d059007df9225288e0af427267b111b195123f3caa6b6ab04688c2441e01eaf4e318a92025f63e99eaf0f327c24ea5ba2b66378a8e8e4a9e797f6c9b768f4395ee015c7064856fb81570fa133375154a809ad8cd528a0a8d92270cb314b9acb7464baa0c17033ab77b70a90153675ef69286ff36170910734385b5d79e95c36f432747797d96291 [...]
+RHO1 = 0000000000000000000000000000000000000000000000000000000000000000176af5d2d8aae842f5fc2401d65af7922125907dea312a045227aba0e759dbe52d454dfb09201fb64f625b9aa79956956ca280d974b8628c2ed41e2ca74131c22078931f9ec05e605e8fb0c75c47be9be1e17b17d340db8a3a6ced5695c4c2dd58be64b7a71809eb3409408352a10ded439cac5539132dc3e63080ffa715d5e7e09b67358d48ac2016941dc36ee74942ba6ca9a9cc3cd5d680992ac367320218f8d557a34ff643e95433e10a2452051fe83ddb90eed49a392025824405965dc671e39a56d747c08bb424200bc2243e7b2a616 [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f21fb81fd5bed0456ca32cd5bec86614ee0aca9ee323d7cda172827a30281ca1aafc41ef638eb0953de0af854db05b4f4be9cfdf54d492d2ac0f3bf7a55195e92359490f3f9d57274cd1728f5e27a08115c2b37231293f0125568113698f0a214243998f365e163992917c978fa40a63c3f7daf22d84d5e5b48a0cf8b2d50eb2d3a4545f6a5ed77999e5ee5d267d2614a19 [...]
+TAU = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031053f7df28dd358c406152f4786536da13d33b0b0f74a570aff7879237abab80a79da277ac1664b95fe7c04886f8495922148720aa262c2a9d0dc722715dd8584606310719464462c5db802542675e8cb18c89f5b38a3c235342cb11f943ee1f8734e77f01ff6eb214158f0c04e0f11e5f0b2c751452acb79344495fff5297cc17b11c3e4a2e6ae193e30ce06acd5b4cf1e78 [...]
+Z = 5fd1d1fcba2ef735a735500c0a1b38a98f654adf5bd52d3a9f8755b825079012ea7fab725a852e529311e332f12fc8030f079b67f56bfe288fe7e6d17c8ab440e334a1a8ed5bbf6277861bb9c1184701ffbd09d77392e9230d0100d5fb4d44843e23c0f765d9ffe852ac2155e2b12f409bacf0862dfc906e4b939dc7ae0c3ca376b3a80f29db69f14b4a2bbd4bbc48ec08d77d03241dac8f4bedce8d1c8d7499870ee2b9105020000886e84b9558de7eba711da87b278d3556866b6ed18143c13444d45fd3b32b016f49ba7395326774c59f38f25160d12ee84677912a14f45364dcff0e936b830076093eb14ded55aeddf56bab [...]
+Z1 = a1807ca0d7f739e13656e80aa2de07035cf73190c3f917cac13d4865a27a1034eafa9794886f44a02a58fbe2cd1c5f7a9a3e25298b4c11c3ccde46a3a53808a95bd0fb5e6fa8c2ca9a99ddfb114f1a0426069218bd384228b3cd4316538b18251a5e05207f1ba3f79d9f1401a99bb68aeaf06cf535ec4c3106bd9e18a10d8f736c8754d61ea5eef5cfaddba6baff234c22f89ee02c8c4c2b206f3bfa2c33e0110648a1ee9498b78179ab51c619101ef1d51dba4a68195199f2df86762e0da5d085bc55099f94feb837c76b046654aca28ffe523178fafbf4d767c9d017752fce8650e24ffd5cd4f17fc5e5bee2289c8da1a294e [...]
+T = 41455a67d865a2010cb7255f370a85e96670f75d0b9f6d4959bcb5ec4cbabc0d3769a4771f41a600ff2eb33c8c45e242b322c08c4ce48f96f3e12f4e8f546a0ede7bf64f709d0fc0c224fb6442c9597a6311348ae2d2268960dcee0cd5021c410dd1903f8a0fdeb626b92e1c635541fce04dd37495cbfee3964400e5676073a33909dd58d4c35d3db9c6abab91e06ad7843a07e693d3e661dc5838b4b36b3dbc27dc43d93767fbfa5fcfa0eb8f36a23e22372c8b787fea0c8a0a32e7f7a0efdc8cb09740a2f57e20d5b4301884e1c8bfebecf67ff3f39bd6f86efcf14327d02dc2f2f48f61bb7a35e136e230e77c83abe1468d2d [...]
+V = 100dda7f67d0cf88e4c5636663e25cb3dbe42373d510b33a80d5ceec1d2a5db2fff5a57b9ac4764a62f8e42ab79b307633fdb8d278fca99d38ab50db7e78f43ca389f654602ee8b4a1c0fdcb96a0ab7d1c3a7b051227d082532a0ac5565f2dab5272966f33cae24fb86c1ab052637e2daa0aa64b6df0932e79f2ff42ed844d699bb58071e94f357a0e3ea4eab414e3168411eded6b43a46e35b11be80d586414010657ef80121fb2624c5478d4e5e44511adf0ba61f1f6e46eda0ee53731cacb78447a8dfdb7223836eb5fc6bef4eff32fec95595f8febfc6575b660dd49c3d0a31bd71f30c8e01bb464ad3054c3d82198bf1ffe [...]
+W = 29bba83364c5273bb446dfdef41be7bac3e357ef10551295869df5704f6c510a043e5c8eb8221c3611a23786bc22fd36901eccd5f3a534a29019290498200da21161567cd490eeeaecb3eab79561153de77b7c8a634567a988f68078f5f2cdb60418fbd17af7f716040c4384f2d12b209a9cdfac61a387fb078bb416d3124a81240895d6f2774907504d75091fb3291ed0de99de836b14d27ab5c03ac5e6f514ef43b047be5675e5005c2b1c1c44eee13774d4be748e1345a0b0f9d35b9d525c254a25c430b58170460870716bb62bf0690306a6b3c7713e6165cc6025207c5b692c2e078b7ca2415c3fe15723e2af38d56255a3 [...]
+
+TEST = 4,
+X = 0d5d65ad48c4a41fb712e196f536b2c6b3c37a408fd74d906f879e978b448ea7,
+Y = a33522a3e8e35f152d72915d1b68fd10d1dbac443b3ee2e6dc0b22448d942129,
+C1 = 28cb4d13294acc2db50c5be09de3c8b43c1f2471bc841da5323f23537df9d311b493c9b403010251014dec4a794b9a958229e5d4d28972734a8ebd5d7ab7be4befd200ccc1a3429182818e40b25cc11765520aa75880984732a4cd755a0ce6695097bfba949fb6fc8dca2f66c56e253099ab2bbf88994816caa5c329208c22aa83522d1cd02f2e6e79cef281bcdd3d0cfc139fb3f57bb081065190996518a125553f64c06daa807634c3b854532fec2b1b64287a8930a5e988b02b0a0bfd3300be9704db4da89c49e255b135dd25067134b79e6fc631eca97c1fb1127c9cd365f1651108f9ac6712711a3bca4fe0f4a732dcc41 [...]
+N = b90494e574c6990d3fc9af1652448de0464df6506749df9d6626c62438b9d5dd1aabd670cb2c7aa9ac1cda6807a9c5d83eb3d24f16470561178f01b6f15310ed17eb298857890cb7c9df29be31a49d64afc4261a0c2384974e1a5ee868978ea38d4c29a3eb51a6aa76771af5dfc49b85a4736477062412e0c7ab86c17e342cad70b4e8c19ed8f596082d2821f47feefd6de54eaaf37426abc10f8a086c30101efc9d800265a43b917d56179ff14dfe8555da3a497dda4f0faddfc78fd05da79ac9af7d6988af02bfbe74342090f6495a81bab6d4fdbf01b13623eab791c231865fa36c5001961e0f056c1f2b2ea7c0eb3ebdccee [...]
+H1 = 240a77b33261c09bbff7da293e5d907fbd44be9797d80ff4ebcc4bca488677d3cb1e830bb49818cf86c5d4ea38975440ce6036d4ebe0565ed923f439f835e27c5f30b8387d7dff170dc3f80a556f41e229d0dc0f307a6434649003053b42e36d11872dde9823beca591b3467a834da52ff9f7b11320266cfb0c884150937549afd675c4731bb0f60c5a58e1d73d94db2dcddbd426e17e1e4d85734b5418cf2e8e19bce5ed69e660bcad7862e47a1a5195e3792c55ec3e07843070683f2a469f21a9621ac10d9fd63c1039fcacb188f439eb6fd0af65daf93b19fab3e1fa8cf8335cca50656d17c83b958efe66073554a52ef8d8 [...]
+H2 = 17b6799772fd72fa0c9877561200993db2dcd13da414ec35999f7ef888d209314586cd131c0159a44b4d653cf6f1f68f2d7393376f9d44ba3bdbdb606f07b89f2f9af4e2fc7754b1bf0f1e6ab19aaffa6230ab7bdda6bbb8dd16c20d5fcdefe5a91bdc3167150cc98e66345a17bf38bf44115d3077803540b53be302267f768ccfff602e07d2ab302edcec8da34eabd7bdee69cbecf0143df1fa80e67a6dd0230d4e2b038f04924b51cd0ea48f09052c34182f7d16e89d269f816bec3b237c88a88af9072ef72606ed7c78e3a2b02eccc537a4bf967f0d6cee9f150f7cf8804e16c4863f6e16bc3bd64c4620e8f128813be9712 [...]
+NT = 9c9bc9253874a40a5a355579224cba50de2b41b28e6090aff68358b3b427b6c1d380dd159830af170deb982bc00eced7f4fd1767584d8c2d9679112404d565caec1ab17d20a2f0266fdf318a98cebd98def0aaab434e5de8e2231f899cd48db142b2893bc3c61bf679e6ab1132969cf78764f27b42fc2fef54d08ef578d8b26fd6809e65540d8433d3d7624a0932b80a71733788371789c3fbc6328020e844e8b9630346bae67e04b6ef762321dc75aa4def408a27ff0b2954a7de9c6daff0a21a3081ffa60a98af89ffea10337c6a8644afe0f5072cf1748fec2653337a85a8bee2d088510863383893c86be8d76682a5b1d4b [...]
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000ca2efcd57a4ed33d138b5b38dffd5196b7aa36c4e4efd284b334b2ed584e40d40353f9c35117435a40aec1fff908ee275155051ad193b80b2104226203d5969d3b8048219f1915195161eddb6170cb6e7e92af983b2a19ed3c856c1a2dd95cc4,
+BETA = 7ecdccaf4bf6e1a02d8c9bd46da2f4699f3181acc94bc2eee95d5a33e9a04175d92635f8c3c1f99102a036db4a9903b8466c8cac928cc773172ce4cc2b16cf3aad97eb8977aac1995447ae68431fe96a25ef3c6a40968c5797758a05daf96de264321a6c1d7b2adac35f4813091a192c88f212203232907389885e37a19a95e9cfcb47d4c35423c6b8b4000697e86a1f93abb58aec3f4fa849b561bc77b171201d1c3f39759cd90718e88c1573bbde12072aaa15364b08d362f29570dc9d6dcf2b078d7dc719ba3ad8f73ad2361af219c37970b59d9342dc9efdf38608f3be9e0bb76352e85507d7f58c19537354dd7cab424 [...]
+GAMMA = 6ef628cb0063385b25d629d4125f7e4a2ca134705cd1dd2bc8b1914431700a21911044501847397ffb950e3cca0a9cc3e556bc451da0f2c020e8838a3c81ace04dcc22119b47cd3fec26c248cdc651c92da9b10c3c2567a25d18c46fe2f83e355b66fef3d0b21f8819b4b7508d32d94eebeb432f82b64019febea200be811bec252e6c0f096090e709f9084e1408776b4314de23310ffff2b1d0e23665e3a73461e925e41d2f5770ea53845be8d5bdb4c9b84eb14b08b3afe1cff50f8e2c15a0387f4f574afdea60dfa0b2c8bdf0006712bf927cd57856e067a1080d12b66558c4d71aaeb3b8fe0c9e6ca30b58de338f04ea [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002558cdb52a093d567e370905d9c9ef5f828988c65fc76ae022dd56c0b225d75db82eac0e618dc51a5053f094e9d4e651ce483df5f923578bb06db308fbf176583109144a405f9276a5080534700e85dabaa6eb248fd9c6ee85a7a3fe914290c561d11e248ddb9083ee3fc7a58eae4a55f2f9f067d0b76ad765c30b5c141606787cb29b7050c7f7ba922968919f8ba043fe1ad4 [...]
+RHO1 = 000000000000000000000000000000000000000000000000000000000000000011e344fe14043be05776eab222785285e3e277333bb492ff8151535495104ea06842b63bafa4507f60e43429a9966f94cff0a80ee455488797a74df618dd5cb3b6aa44de7f0d0ae2bfff382fd85604271c0f0405de4922d8ac7a4bb7e0056465eeb7743035fbf9c8d4d5fb246e5db797f0e33f6a386cc05cca69634b18bbfce27506689317f567f3f366e98555e1ddb10f0ff123e605333baf493da5fbe01b6e7c851d6fb17b8a84597ff10f5a364be58803963827dc4f087714e769a5b0d7841b12eaf258c3d6f68525da2e7fdba77b8ebf5 [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d44e786680ae4e18511c960a452a70091f26b8b8f6be6ffc35c012f15c0611a45c9da5da885f23cf892a25c80b1decd7aeb2a031e6fce52b822182f429c03211144d9c8dfaa68c0fdd7f9ada18f23a41e1969647c9c8487d47bad4185fcedf898f670c7b895ab1d1bc830884ce0cee397f4577cf071b3b727025a86007c97493701ffc2ee28861a02b7650fc6541ebf69a2 [...]
+TAU = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000375293c1d0190655181afed6319fb78e3701c6ba2a5acf1363d6e39c6d7a705dc3c334228205d2e2c70af38cb681767c96a20c23cd57e3635f3209928e7fecc13c82295b2841742a7fb01b86e68920324c4226a65087f02c6f65ce839f54f0a62a16eb2fc646b732b399f13105247a25e2cbbf34ac8796fc24f78c3a7bf6967f95a26f2ebe620573d70995eabafb1b25727898 [...]
+Z = 2e099b1a4a485cbdf9d65af8caa74308c1f9278fe20a7ce483ffd5c6ace65feef2447e9f06a6c203d4eaa48b0716e7812d9155f679db67c2e9f639bccf27898d6bf555f6a2274377c07365f2601ff2689184f621ec32eaaeb760bfb1508497be37ddbee9048f829eb565eda0931ea897ba122ea270d4afddaf85a5152325f58c2b38080649d076e945c946e714259de06eee6b9f36f27b9f009d01285e1e1962b24a6073792aae9270b6e69d49844c1c76386d3d7656f1ce5a3f58be7aa64188f8969018f1a6464085819c291c3b0b527a8295002bcad8d45a7fb944b58f5d48f22005c1a860c80760ce7c84f907835230b38e47 [...]
+Z1 = 1ed52d7e0a25345419f96e59845a414b6f21ef755647a9f6be33f365fe5995a0c73391f4e3ea67f7446afbfbe2f700376ed153abbd3a2b36f21fba87ffb049b595db16563f9785f1d4711fdf86cb98828876b8889e0544f90a121900b9fa43f489604b1db1ef8ea9eeae8c2173faf6c550284fe1512e17c7717049ac3949bd6e5e579b7250e1b0c0c07ed7f2887ee1bf2d29427cb17dbb46df6e7e92098b000aa712e868ca5a5feee3b0aaa7bb594a23179242282820c2132128bf8c542d6491d2c9ea2b5a975ea940471c94f1434d129119b08083df4ab7c056149ab357a526c658e84d0a6993aaa679ea9c4aa101a0537a5a4 [...]
+T = 81f2e6a6c3b8321d0c69105f535217684adbfc368d3a1e5c9821a9a61ad68268971b47fc9089fe5f50a5c80785b2a8b0b47a59c7c504a743d62b9bd4172a31ddf5c3003c6f6df8337669f8ad75260aec6834b0bae014374d033527e19b18be00ee413323e793614a7af36a2aac2da0b99622d77b0be4e2f6668e80f4ed07a62734e3ab292c869d291276bccf7e50566ea261124dc7c9faf57e8635a43ebba57598f943ac1d6dc6ce626018a1f27bc08aa3e3d6c16360467322c685e7231ae07cd36ae5795d8205e585b216ea5a7acaaa202e4dc8ecf495d75c858d58cd713eb8288d2e42730c87422da7e45673aaef21424a9841 [...]
+V = 4d179d59808e4a2b536f02dee8d33a248e96c33474b95e929faf72a0255c11fa30de2434831c08132a3e858acb3fa10ad2ec81063e71b2570cc962e7f2138cc1523f1104e551869706971e41e728495b78b0f8812b2b94f22d19fe989af3f6558f1ad75de0e50ea2f0791d114358bc8edcc1b27799e67cceea0a6f4b4e60668632731e340f009870b3fa4319cbefe80d05f6d29a4deeb530fb24cc0cd0bf307ee1aa5efda800ea2c43aed36f789aed560457546c16023f74e3c05ec0ddace49ae7e47abc09017872487db8ce95679eb3235068f88773c183147d53abb570d2738edca1e45ab61d65a0f50df5d90b7e070abe3b70 [...]
+W = 47af7c27579c350a79b752e4342fb04624ded11c9d01e77a07a0b4f112848cd897dde49bca13c612f4a027764a5ab9ec645e66b00609dce011218120488b96100453ddc69902795f9158851c4e49451182a240bc0f3f3556371aadeae0b85ca358f276dff4cd2a342e76f5399884422e353fc469a1c4c68680f3bb7ce07dd01ed249dcbc6ff25a25b6e30a72f29a43aca1ac294b489f619ca91da97094ed9465539957d655e7d827204a856c853854e775ade46711feadf1ac454345482904c2bb00fa506803532535d42c8521883457db54decc95cae915844f016cd6649b5efae9f04bbeeea51033b9c86ca88508abb0e94efd [...]
+
+TEST = 5,
+X = 348ef8bfec8ac5ed9866be34aab22d0e9ffdcc8f426324ee33f511beb9453094,
+Y = 7a2142b9ea0941f4b78a6cfcfd9f8abba578b77e18a35bb9b65b863ee952c86f,
+C1 = 474f026b9643e6a12097faebddaf6ce0e05f1cee30cf85cb4bced1f88df89352d4c74acfa3b1def03d195701214b879536b39d94a4a94a8e8e356f7ad22935be58a588a1fd8fd3e66e152cb34b99cc7e2ec57284321f3e04c977aa2bc40dbaa1fdcaa2de8584bfe881e3ac8752e76d4d4135a203b882ceec4ba3e86ef3b43bd00a04dd9b624ee0448d53c356844a9c38b0e15bbca9c10fc038c77f84170d9987e40450c0b7c3ead7f66fd61a1784a304a584ceec2403b85fa310cfa6818df5a2693eacbc2665b8012f62ef71c89a8726d979eee07e34e27fea10f0527593b0adc541f63a21fbaa6d40140157ff878c4337959df [...]
+N = a99afa8ae67e3f5c25568dc3f6d42d65cbf27701d0129df93229e3ff00bc36fdcf39af140849f286ae515be84367a5c9263f898aeeb988a2d98b404fe84fd77da0f6dac8af9492118b74d855ee3363b96d28205678f8c0c87afbc1dfea5ff2431d5afab9a2da05db6d16e0b3eff0c4182e2283fa2dc4952edefd6ff8bc54162ce41d175688e5958891743cda594318da0ee9c2a5ee896c612fd897b18115883ce10eb8635d7043d1cb07b15879bb061b3b4eb9aaeb3e55b4affb66ad51694f8b1b665bb261058be2bfe2a23d0f23ec99c6eea406f5afc7c642507f8841e6ba85fa12f5a89525dccfeec00f35adf8c300d5cca0fd [...]
+H1 = 39bab922821b6033cffc3982a23d7ce76660e53acb4a5501b51b88159114d60814df53cd85f3ad1897bd88a9779ac826de89f458d1dc29bd8ed11bc6a143b88c0d302f8cfd60b4460a822e3a6313d83ce6bade99e071f987ff52e88831b62624d4ec672f849c8daf46ec5c6069b2f558b8ede9adc938861091ed865c234908f2a2beffb7a0aba88236cce88e64b43e25a011c0e999aac80e2946c344a6c32439db37d2c6fe65bf42c12131dc6c062aec4d13b240cf8cd882d6e4020615f85eed20701357bcf6d0d4e288631d3be81ebd3509c6894729a66ac827f3a7e594580747d61836a47d5c74cdcf841fdc9ef0d7ef243ac [...]
+H2 = 43c6e5175dde8269b544f1e69852145c645400a79be687aee34b6e47823ab132da8e58b2629697e807cd1d67f7bf75e5aaaed23ea5896bd25b0b24bf794057c3dc359bb805d047bd4ffb0d6461d054bc8380c1de405174b8e6e3284713cacfaf2ffa6e916f114288c9fd7b059212d71796e4daf5392f3ae0e97cb506342fb6c28cb50b6cc0de0b291ce7c64ca61b303bcc890df7e2000c967da01825c3b8a71e117e012e3c419ae9f0b6f7e4ec217add0f48260c9950ad1a016be1689a7db2e2d1770992c17d83251cee54a7ce1d0196713b9a2b4f5ac32217d189605f85da9b63089fa57bc0a043689399455fd45f56ff6e5c1 [...]
+NT = b8d5562cebee1ba65ed1bc96f5a10d7f76f804ff76065ae71ef8e9224c1e8ecaec249e4ef4794053866b9052780ca0adbb656e56427d5e7e041b358a5f23036655a3bf3d180a5795f1aea576670ddc9ee3403dfa1c17babc5d86bd569c8932e404d727dd4ce769646413617a00c11527d40ffaff50b205ceb73de9591a3e614c65f92e1bc01d6f78bc8a7bc349eac9f4d432efa76be3a18d89f49abe6ad2e8fca17a2f100103e6622e290adcaa7b9d80b5fd61c2cffb533de4b9a8c8a0376a595c360f193319bce77256812e972f1e4bb2e38895783f870f7958033a59e3023224da56f5479d6fd8d990d361c4b28987232ae33 [...]
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000b26e2084aa91e619f76b277ed88487bce12d8035b82ecb8aa3236190f0b7731e4039de6938d6cff1793780deb57fefa7528078b935cfe23a6ce0410deb89e42698bc19874bffe1290e49fbb57b06e249bf7d2f6dc8c99796b7eac9ddff6de30f,
+BETA = 21d1827702c40d2c6e22dbe5ae57e318eb6ee290533d08ca8e5dbe9371732c3ee82cd51ac359f7c1544949499b99c53ad457d88988585bab790755b32182bf475f0caa53396c0f3cdb9942046d0cac62953c45eb22fc6e5dbbe9ce465031673df7b87f272a5296b69898642300fe4a9c235d1f899d88d1e618c5ce60bcb27d6a5b0f0154628940c3b675fea8fc6836114b64cd7b826ecd49502ef18d02d0187f68c74dd4ac1ada53b40ce27a6277c038bf1741d4df67aed46ed0857f314eae02b85fd79b306ada6853fc446defc711b45b638d46008fcae3da87ade1d3fcc1f679874be36a6e4d3d02c754c6515b735d2766b [...]
+GAMMA = 03ce605e6a5d90be32a8c1bd35c160a018dabcb60d58a95521eec6f92c5973555237a2967e6a89886f1f172f5ab3ac067f04e26f3e9d6ec01df1e5af78e56681b7e79016d4ac3afe14ebdc8e555f1aaabd7e3716ebe6d382c406f1f2d131aae2fc0c9e9ca18e8818b79976738ba9d9e2515ae87d7c6e4e2575403cc2f5b0ad9fdded2ad5f12e7686f5e5d745ab851e154e8158755f1fd4b683cf756ee2e9bb6ba0e653337ac106b0edb0be7e0f92e758c628858edb809ded9005a5dacd2c5057ec66390793b687d198f20e37e42a5dc8250f7ee5944f2d7cf003a85edb287e1697bd1ff1e4250415b889e9c70ddf0250daf8 [...]
+RHO = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000571ed6300b126afb416d4d187a95fd63ce5b561f756ba3faa280797dff874d18d2ffac2d6acdc8eca4f90085c81b705de40f3828faa4b9e9cd2ae0cd0399a79c76be497953b52f2552e8b956080963208eb7c2e49d7bd43a8d8fbc8a5aace41e2fd3cd49bfe5ad36204578d6bbba2f00210c52b28fa48f9bbd11d679282d44d851a5d34fdb304f4d3893ae875fef1b5a40e3c4 [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000002b436ee347a7d5f960fde338fa90d90317535a47f474bbe13fa5941be0d8e2084d57da653c4eac7e183cdcb374d231d2265ace7f8c9e10a8aecdda202966960e8a06fe981ce5809f5bd59b6a00e6b0343a58d218b0ba3b3616e85433e89bf9f0d862287ec9173f689f0c093f0d30fd716a812b1c176a9b7a45ca1fd6752929c32fd37264b8382541fe1b8650b2e0a550357c51fb80e134d74db850fdb2eaaeebdaefe64e3562e91d1b18203bbfdfea93cf77e8b160d99c49b5664fe668a7b6b6a559518af0b31d138f0cf8e664cb70be8857e [...]
+SIGMA = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432d9e5c21ec50367ade18f12bc1ec2d287b1caeee860267fb1817f58a52c9ebd5eea7762556e9bc44581a6d59d8e3fa5a8d154f5b3747934aea4e7ab2b727a7456e7fd46c0b89c025be5be606e75fbcb147e4b46c261d43bd69de12138f53229fd580892e75b1b68df0be9b34112ba8a62c4dc740a00f45242c3d28c334f3b7b1f4dd4d507b2ee2a3e10140d4e7ff8085c6 [...]
+TAU = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ddc8d0265bf5f0d8873b7bd6691df6872afcbc09835292e020f0cca90222dec513a6cc3df6f54ffff56c3c2b3a2669a1672ac7c8e456de21b7baf03bebad9e6ee3a424dbbcb37aa1c402214fb9fcf3258e73ba48bbdf45a85f301844d5efdfe95b3a77e31322ee409debd94915320223f76aa5e5c81cb54e32635aafd2479247fbde9fdad13ea380fc6a39108cd9850b4c372 [...]
+Z = 9b89a7ce1c780f7b6d9cf6031e450b05d804933cfe19d870d60ee2b73f6baf1f9132ce634c88d1b7d0b31b0d7d6460298b00fe416a9f43494d4ed96055fc8cfa636054d1e49455f1c657687732a80d80ab7e36c3b2451e4700a815fe7eb911a75bca1425454dffb84ba1126f647855d22716d52867406345ae0640f88b1b09dca3c4022fba846ea6e8e2dce2081115cd90db3bac96f59f9e79659211df4773d48ab64856c46e535d4b6fd8dd733380af6b264f04c2da859a6b1d321b5322f527a11946c0193daf39ec950f85bef481b1dcd5bce82b5c28d905ff8f09a13d86f8497934cdd715048cd052b7f73a33323ec6c54603 [...]
+Z1 = 4fb8f1b15b323a1274d17eb6e0c6785721133802c960dc5202597c1761951c9511a025179eb3fcae1ee786f854217262abcc6b81688f8688c0aff802f5ea36b55e308f63315b49b3281878e8a1e75ea793a134f73af51b2c02070efbb7e85e6b73f615747ad9766bca3a95b48fde73ef4ce5814d1e36bd81855187d5f8c83cec45aabbfb42171a656ee0020dfb0dd543aa85053a1b5e555c5dbb2966c14badb4f1d4e8cbf981025c07057fdf54aef555a4f63d131babcd6e445014774f9d4641891272b4dacd2d876983451db8966b5222646db4396589b42f81ef2ca1894bd3ab42a6b152c474242b3a62890143e11ae9e39b7 [...]
+T = 8b640a08e80bf886fdaac5f7884ac97d95886126bb0576e99bd1b24e697f24528960c29d935d2d1488db3aeec956211c778f58662bcebfe73c6b1239c914a0d6ed77ffae8daa3f17fe5eca77b511fefe13049da3dc7f8294a75e3c45a97b653aa863fb3a82803db0be595fd5da72103fd0cb30f7cb14ffa03087037a0f6c40694ab5a5b8928e0deff0f4ceb312ed63133de6518465c2345dc252a7664a394ab685a4bdb3a983cba0f77c13cbfdc86eca6bf3d2d3547ce39343e80ed7506b574243cd7fe726d6072932b399add2666fb677798ebffb9af121c45568bcfb568931b8ebf78584eecc7f7ebd2b3766905c288f3429f2 [...]
+V = 4b0c8bbd6b76c6ddac5433fab1709c1f0e2204a4a3313b946ac00f9d6cc7cba41e9e8968af1a257fbf1eed1de8f1d236b035b0679eb4086fe2d0c63a74f75fec6021c616243d544a9b2099fa080ddae675324642ff91567f32dbe4b23485be2d5e78f4da71ed50efaed604c0dd0bf43bec726d3a5f64529783e6331d8ed243456989058f9696c04e226d0db3adc2074c1b1d3d243e0b6dd07dce362ebc3d8beeb28f4b824c0333e86c7ec0a8aafeb45e9f8966c967e1a688351ccf859901247721e5bb783e2df2ec90c7adea76bf703e73379f3f9b00a3998b425418f6c94f2eff51477dfadcbb7103f50e7bfee00600d508fef2 [...]
+W = 0808269990a233f0f203b46c1f4d89784baa2b4cd80ebe1d4adddc3ec94f0596544926f2623d4fd5a36dda638723e316113d0efbc7682086a57cc6e7c27a18708aac5ed473d9332457c2f87b6be45e7841740cabdf668828caa16d9ee7b6b70dcc544fa1016880a63b28dfb5a5b1ed4421e0af50c245c0fa22b0a24062e8ed63fea28e407a71ed41644422254956f2af1daffb553219419ac92a28550890f81fb10b741456d23cb03c2f3feb859701cfd182120a0de685ecedbe116a3c1f1e96a984640010e6a8fa85e332f4b5242e561498fb2cb26f9a48d0d53775efea853e269b66e10e62ed2eb01157874e7e675ca95c789d [...]
+
+TEST = 6,
+X = bf3f16e4b72c93b5aec5fe3bfbe7d6ee7a1d4c4d0aa248923272d5edd74ab1d5,
+Y = 8037ffc9fb1c17e1a1328277d16f4b86593c675ff7e0ab5345eae009b633ce29,
+C1 = 674f0885cb99a92f4b7cc250375d95777a7e0690661b5ffe8eec58b6388608bd42beeebc133cd0f2f410cfc6888b9f186a69b5904626a06d556921285b0ad460ee0070bed5c699541a134109fffdd137d3d288feae0264026430a2c7d19114582778c51e2b03cb79f9d70ca763c2d37f3ef1adb51c22c7646c1734a5ace9a9c1ae4faaf8cf8396036169c5b80b3f4a4155e06cb2211f61af6b0b99039d5b28a792fba53e0862b4e9f215bb256f6faa623851dcb1017bebc83f827ad5baaff7f0df87b5a64172bd6dd2b104f08e99cdd7c19ae06fadeb2d5877a931567d157fe8c87e0a8a9f3fa138365528b92581f8773998a50 [...]
+N = c99a67c86b9c10af44e56df33f28d6d82c1a83054f386363c5a1b60316588263b5f90de1cf52b06ad93e395566dbe6127bd50f8fd2dfa9ce9b1da7c820f38898044e7d5164a8f91817789c0ee0f5ecefe2e73cf5c02f684ffdf77c77fa7b8945ca855bccd1f746f6981ab2ef6a27402882a720519755c4b99b562e9911f7af3715c29cba19d47db994cae657a7c86b8f31ffd517250cf0dc1f054fe3bab0881fa526606ff3350d3fae406fcd17bd554c927f7685ab8cad3fbd211f41dd250634ca6b0204e4f7acfc781350781035fffceece2f84b9fb088a0bba3273f33ad8fe30528cf307008d85ad3a6fadb73beeb9409e8305 [...]
+H1 = 73b5fe5135a0a46abcc1292329d6b93982956f62691a11db1be420d4cf6dd6ec79ea51e15b9202f2725fd9c017e472d03f93f604fb31074d8d4eff1bc88ed44f601d09fb3466c366e648c53fd9b5add2b11750f5766a1a26bb31e7aed7a79b06db78d67a63c4e12049d41e125efa72b3896437fdad1f2ba1e3a00dd65e6416c93a01d77880c39d18e16cdcbe89b6db6870be52bef130e198914951551f923bcd6f0f903b17dfecc252ea54d0a8eb45e17fc3f7a076cbc7d21dc73c47ab1d9aaeb5fb9eb4aaa1074c5c5a91cc1beeef7403f0bd5fb80183cc16c254ad7cc0b6f4b6dccb8b184173f5fd24fb7e4341ad3c32edb3a [...]
+H2 = 3a83d512547233316c812acdad94ca27d9afddcd879fb93357d2aa8ed33cd162e8562205d1ed36a1fda025c59709351358dd17d44fec3b7adcce097e4cbe0d15a966bf285d2665535fd1bf82b5cd6ec911d7f2dfd9cad2315eaac54151c5965842a6c27feb8081366bd79595660baad2cdf33dffcf2e19e0475db0a33e36734c9fd788aeb0a1116b708924d3f703ef08b655b4e5266239dcd49976d0198847e3c2ad719a4f77eb964495edc3425e04bdd72447f86e2969c005e4a5ee3b4d6c7096cf0f6cdb8a4fa767cbd1c95ca0055f874dca3eb29c4acb6279ecfc36f2328c45d8149cacc05b0c6dd0d1556cf6f8fee413e09 [...]
+NT = d732a7a46bf87b14bc8a80b47a2867203148a8e6835f02d0788a0624a0161fe67c447f4e542bab2ebc19afb9a4c279f06c3f3797ee6a98bc86f9ecf92118547db3c8a7241e3f184934d227b408f68958cba730b5889b159ef3f75f466228788455fbfecba32d3e7fc1e384b06d116b6f1403ddc9c0974a127dbfb009378fa38fd5042831da323fc7b491f98e4b9dd143fc3c94c339316fee2ead9f19e25047fc67f8ea8b3b11959f544fbdef7da6f663513cf4946d34990d989a8caf60112ec6c1278430715a53c0374d7a1f3834cdd1fb4663637f7a09398ea45950ceddfe667dafbb963f617513f0c65ee0588b85340e268df [...]
+ALPHA = 000000000000000000000000000000000000000000000000000000000000000009f9b89fc8ba526cd1f060c00bbbcfa78b94e6299c1730dd553db0d0ade959fc56643c57f77777b1c738e213462e201bf0ddaa64d311a1013facc6c5bd7966c468dc26f8c10762a38fb6aa19de1996982f07a6b23f3dcfef181c1f71d29e71e4,
+BETA = be2ff3f9b9f297da5c5b5a9e590304e8afad6c0aea596a065192f3130191d8a8422b3a9cce96d308dada3e8721d465c2bc1e3be8067542e1cb0f26829687714bf692b79be84bcca4e296aaacb01b72cd541fca3553de4c3c701b73109c0593d8c99cc81059469990cedf277b02978a953a373f17d57ec8af2407c680f511208411aad7acc7dfdfaf849d2e6675ef85f3c5d629932d898f2dd0c156b21f033e4808a0efa43938d95450e2a18d58638e1d30974203d0f548c8aae4073b982f74c573f187d2880c072591e9bcd17a36e1d0591bfa8ad968aa653373533696ab14427d177cd21900758923842a86ed580c5a8034c [...]
+GAMMA = 02c1c20850beaaaf67a4914b888e6f00f118e6c93340373eab31ceab0dc448f1a3a2209247d78c1ed6cfe3590989af92a239acb677cc92acbc47b56f36a10e9abf83fce0d35b522ea489739bd7e2aab16a9eb4284cff6f66a8346014ec39bd8668a160b08a778891040cbaf9e2418d5b5000bcdd1b7a9551b5f593211ca3d599a0c810e42f5d5443657cf6f121521ba201f6276659d03051a42371200f86fdf6684ae38dd550b2f8f01aefd2c0c55df1f755b25211c57f51d5e97f3475bba0be942eb16ea1a02e22d76177bbd05fc625141e3438a3adc79fefbfc54c19a26546d157728bbdb750b0c219282e5bc54d647eb1 [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006542dbdbc39b619b5bb2d57214263d41e38ef96ded050c1989b40c5ddf247d6072d859fcb0ce937a7585d8f93b0dcee46e80caf2798db2554bddb397bd38a87e26649c7f8efc059e849e9209f46fb1668c443c10b04b8ac62e6dcae9e8363590d11f43493f94597dbbeb7862c44c5a2a174cb9c7887fef84a4001fb19836dfc40e2d8447ac3a3ccb1fb587a565ead875c5b7b4 [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000002437bf03ad8c380bb1ac61d1e700736f39402a9c65d81c2f60398716b87f17f10107279bb63984138cdb9b51ace1dd7d3c9c60291d0c04ec8bb6bdf636c8c152f2545ed8e7f50e0261b1ad239e74567e65d3b4275b18c5e8b29c345ad1a51b7348152b9aef772c923cb7595ca405c04b0a99aee7b0295f9708c862010f2ab0f4e3c036420af56b64981aec4c4b2ccbb0ab56c53a8eb8a7957d995ad4476a145f5d1f9d66ef7ba2283b0bd795d3f2516244237d6ffeccfcb2b3a20d546cef57511d3cc3a3e893812d669609a5c876691cee14d [...]
+SIGMA = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b772e157c00797793a4cb631a787ea03035cf16281273d191d997dd98ea3cfff29c4bd149e1f18da4ef59c1212b1d7ac16076fcff3be210d1bf110898a8ae4ba2ec0fa0332e39e6b65e6980b78f68431bcaf6abd0bad0eb88a86d63718f16fdb9308709e2ddbb9fbeddd8b194330480d77c20df1d9a3063096749850d118cbe8a236a352b544ae3f4e62c5bb5491bd10e7 [...]
+TAU = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e2923d7923a23a13dcb51a7d2c8e26cfe10e972c3d61ab204ac9262a96957a3704ba137c1bb2b8aabef081149c7ac3beb94061dae15e7cf03f6ee1aa29eedef23dd75c01dcfd650c06f7825e0cdcf9c1c240333dba5ad8f5eb9b1f62180ce7f6d9c5101e67a533e3289ab6eaf3575b6196cbf193d1d116a1f7076da8e400f2ea6def91565d9db3172d5742e31b32977dd6ea4 [...]
+Z = 489fe2770d155ef05df803c01c539ad96100c71df5c615ddd873058a30f378cf701303851abbdb254b62dc9800084fef538c254cfe4e0fdfce5bfd520b3275ef69ccd39bed796bcde909a6dac7bd15ac91b24f9b5ff8fc7251825f96dbbc61666525f112847d75f59f5e5c04b3c05638e684da5be6dd4bebb42a49bcc5e6a2d025c94ca0017f91c44547973f8fe079d02da419cc3177facad6f431ed97ef2ec7591e0adb460e8513ac50293fced0f19a2c09265304f008ff8a46be113d80e1cc6b19d3989148e78b480a606728d7ccbdbae5606b26244bb401400f5124f281906434c10414c5bf082e346298361cfdc4fe8b4811 [...]
+Z1 = b48f6b154d7ebb0b0d32d07bc228b9647f708355b673461aad043ab1bdefaade0b7ae4ead82675db73de533b2e06ec50f82d263c4685977f675631cc6c64fb2f61c2d0a75982721980c1a270c424fa9dcac7a342f89ba33f77ab52a180f91e149855094e603b6e6d882a58de8664cf9d7864bd8490a35f0cd5990f480bf4879a16b9aaa218a0283ae62fa501259c11fd70d4d4594d5221c8eecd01d82c0e1d1a6027661801c444638dd37a209d5f33a49ea58260413b6b9e2948e365d4c90ee2586bb700452f9eec12372684bc95d5c30aa9cdc0fafd1929adf2f8b1f6da83f1c81a56afbac30304137fec2b3b92b6ae36e8caf [...]
+T = 196bad2ae5b86d500c4c617bdf050baf84bb5b14e49f0ff415cc0b14bbb113d819b16dbb3f54aeb0ea8feb9cb2e5c0a24cdb035ad5a44ccaa0a79ee6ed930aaefc64c4c09c1b4e16f7b940276964b54962cdb597f6a452fde47f35e0b4f1fd4b96e3e5fc19e56c80c598271c55da739e6760f67bd7fb812b2abe7e01edf81ca3a516758b36f6f27aaa03fdd560ca912123175b423d2491874996dd54bde5098dfeacfd55f0034448e1c0f0349688df5164f9d8c4f59169a10af2440e8d9e68070d3fd2c0fcf7fc0ee103b7a5199fa1ff8fc7ba3290b60542bc38239dac773a0920ccc78616511cfb28165f2a0bc65be786bda431 [...]
+V = 4e8619abc301c1fca042532846a489163e261fbb2daa79a0088302d6bf42ae3486e076c333b3a06fcb645c8341b4ceb68e5040bbadf37c613160ac86904e99a68ce666abe2d56cbe08f1b1fa14ea238eff2f261bc0ac97135aaeabe039603bbb012cc81d252d79591882cbf6fcd653b22ca3c65ca660db02b0ec6dd7fa3231297e93f48b76a6c527977660ef1e0842f1cfa8877fbcdbba8090e835c8a80202544f21f29da006f18f40c3e7acc06837dd7146cf3cdc6e64dc2251125c4ab1f527db3d0aab63834c8434e34731d4e22c993f1a9ccd25fd60cf218017c795e06756e22378fb6aa7b6e9bed71f8e531466048e13133a [...]
+W = 45952cfb748611f2fd057b60a89bae1ba106d172553c36793b04a22c8041813bda7107c329ca4bb83a39c09e43077b49bd2aa4b6028d932b70dbdf6e0a2c156b7b07cd84671b68c082bf67bfd5d505e2132a041cb601058b20738c2030cb0d57dc80ed7c67dd964d4709091b8631c438288d7bc9fd212a8c4e652075c19efc63f122e22ba3c63b73e2cdd14b98e4ea7f69163ab93b5a7a680b5d55c5fb950d64c43d8ebe15201ef1ac71d095cf44db4480ac970c06b268e98ffa7baac8631f3101836b58a443e0be2722e528daac3e0fed68f68e2c0f7933cdfacbc385134156bd8319b8cb22c1bcae0eaccd0b5b6e47a78b5d99 [...]
+
+TEST = 7,
+X = 7e7c326c27aa47ff5f0f30e46d7349f3a8272387d3d8b68d952f8719f1331874,
+Y = 3c57102c901b9285ae85537fb190af793f9909f9ecebe8916581d23b8f87b9ad,
+C1 = 3ea8b71767b4f2f6ab3bf4cb10301af5e1a5be46f5100b6de738e1b97f22119afc6a2b8899de88d2a062554c1c4add75f886c39d5516993688c402bd771a26ca1aa056e08966933b7289c43981127321ac0a5b71992fc680256c7e192f928529d60cb51742f01b196cd2d0584ec7a4da4259cf8976a8812c57590fa223531ebaa773264b8a92a8c9affd6b465e0a5571333cb7c845ec61e18cc221d9d4615c16995007c6c533126953038239c477367faf412652d10ddecc28f6b0a8e83bee1ddfb9f92a2cd1842491684d224191612258cacabb510a90db7e02296583b7c68810958b97814e2b47d4777eb91d8a4a0d3136e75 [...]
+N = 9180cb7423231e6b4bec203faa3f242ba53dff7c37f40477e0e9dab42e1218d5151cd5e1aaa37123c3ecf3779a38f457e0b82be0356e4f32272850a00a074b3cc7b3dda5a0004d1e70077191a7f2efa7209058693f17500694044fb94aa523b89a02430f657d470f277b5e8d22cd9ffc4870948c2c353b66d83048286bec45ff6c45893d7d31409353ac66b4a38ce4a84414b2e12d61dc57461eb717f142df542c3bbfad40b60f5102a724f6272ce6f27fd1be65d65770676b02cf0afbb2a57883aead9fb456a276fd4331b92f905a1e923504b9d0ea1084ff5d390ab7372516e85000f4b842b4610c8e79bc1da0f05b2e0c3a14 [...]
+H1 = 0bacb0b762d33f034e576359482c49a55feded2530a18ff5c0d473d6c0ecdf1c8d301dac6dde4667da5e6685bc6c6f62602c177b97ab7ff470c4fab6614de2424f3f603200763386e2c341529451ea24d817336ba1541c9ca8cd7ec13779fc5a5c96d72cc465cf1fb5ba47f1f1057af1568768ff3309d2d684bdc030649e5d26ed8f05fadf9692994dee94e262d6dd774b8b9296d2e0b2e7608de0e3a927222515237606277352361f01f1da8e0e8bb3cf34bd1a80320456a4eb895c774aba538472e1fe077b3793426f9af9e7110ab5d9a0f9231083438c0650b26d33849aeda055da2edb4af85a244f907eb543fa5555e0dbf [...]
+H2 = 9a2d4edfb813e69f3c1f1e0a6bf3a76fc50c8c5b12425204f24a73f4c8584d0cf150ae8ab9761fef3853705ee265bf4d57e719b5d1435f35877b5fdec6ab9d222b03411b3c52af12759908ba007b7cd1a79e75b520e1d022edfd6ab7ecd53aeabc6d3cb3029e9f25488c69b60295b6106fd3817536fa9cb98e5d4f3336cd199b861948be81720d8234772fe9e6a9e018b4bde912d9d771baab5f55ed2f9fa3061e63c039070cd3457c66fec7a832a4b684f20609ab2df59c8a3f49f577dcc7a39e14c3b3f58f3f14213f3586d4256ed38389800f8cce9a1b0b646f9ee5090ed0231a3531d87dc63c48cbbd60cf721254de1b6cd [...]
+NT = c031847390333f4b8b1fd0bae9a57ddc4b34bb9819f5285d08d0943db0975b61a43286ca3f83e9fa8768d670189f6ecac37cc2b5ab7e1ec3341c21b5c66816c0ad65a3bb2c45825f85a53bb40b31a89c9ead55706eeb55f8a0819c8b3a5489de0c5911a3a3e9ebf42ea1f9cc152401419e33a7e15f8d3abfc4739890374472a2d714e17587350918ff7c82d9be44f5541f74a7de905b4dc9d0c8333fcd185982a5e7a9304551032115ea99e9cd0e33a9b0c3086cb296719394f95dbb0927d4857f8c4cc4d747e0fa14d1d8478a31a124607a91c7694d511e39c295282ba72953c1460958ade560cdd4f53a4a4191aa5a4711cd9 [...]
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000006eabeb3d44604e9a5131d69de1c930b37cc0f58be5b20892f30f5f5f83206f5fc67e576f207d67ace53cf49d8a9111785899fbe2266189155cd3c464308fe627dac64b8097cb925a1988cc811110c899eef3d1fe3dd60787b760a5fd56f89530,
+BETA = 0de765de803f9293dff90319efe900ec36cabcfdd997181cc4f05609991376833901cba4e4a80cbd6518456e35bd6f96ad52def6be3e0a20b16e1bfe098161c0df0326a927d971ee3c6e192085bb21ac0e74f28ae2508dbbb7251d18a1b1f0514302c8fe0b3ebb98608a94dd0a6964d505e66e0f64b70cf67d77468821ab87707fadbb67a0534013fa31238ce00b0a1259ca635e74165c3a833b3a9016785d5272ae139435394642b9a72786c7a4ac668119d7108ff8c3961ff69beb3f1aa37f5399b290334949e34d6695a312f225e71eae910d1426c433bd820439d3d1c8cdf5bfd03ddaec8e6731e3ac048bea418655d6f [...]
+GAMMA = 4ea4a4ef80cf0e692ee5f063b74d05d32829e29c2a3e73b2c87409b1760470f5fa67d5100c5d91adb71260d62a04788f2ad63812c73990fc34a2b3c1d1c79171358b50bac25243a5a321d62a142d67ac767168e73835228a102922ebe8659e103642f8da2a5538aa3b620675183d6f08ba131602aaba437dfd7228fb199ea13e37900eb1084ed58083be2da1979cff5c863a9c65f78e8550a4814bb90d4820315fcf8afd05b35a42a27a38bdc540a3df7e9ab172f322ec56e2d82f7b95259db0fff5042d0093625bd634bc8da464547635762b8aa42c45b21f94416b4b1a80e8aa1ca9b69add8e96dc487f7e9d2e847e30a9 [...]
+RHO = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5b27c4a2ce799df5f8374e945fbe08ecd4108204891387cba73802c1cc960e5b207c8d4eaffc7d6530e8e5db5e441e51c68208d2f877774bc95c6fbe313bf3196391ea25612a9f3a1d696f11b7e18dc81ed900bf8d2a8b4ab7d66843dbad21dabaa530ba133540729e7430deeb2660baee9802991d5d76602242556829e70cda0f7094365a5a8557e55036c2d2528e48ffb7a [...]
+RHO1 = 0000000000000000000000000000000000000000000000000000000000000000ba9099811831275068342be18a35853f25d16836a35dbb76d3f1eccc80b6e056f01371750405674eb6e7978c58d39f9718bb9b66e92a7b78dd6033de80a80e34275b4e69b98e63a281767e1630ab885190a665ff9ac4b5d2244437befccdf1d474257ac6e75da0054af4ff18697d05acbce149cc542593f2f8e57c5cbc7b18137166b0fd29e2113c616d158c9048f9053c44284fb3603e6d7abe9a000c425f0c5643f6b3518f32d5621c43900a1cc9f076b95abfd4a2d794ab8bbe4923056524269ae8e62b533f6533436bbed74c9612fea8d [...]
+SIGMA = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b77c48f17eada1d086ba65a8c76d808c6b18733874e8c7cb7a32cea1cccc64e35197eda0272b6f5d3d006f6e667adf78bf2e54854060cd763b0fe51daf65ffcc277bef6dc33d05b5a2f591f49d0b6a4d5411e5616aee7e6d7fc978dc6f1f0338dabd38b78d7828f2ab4f365b5551a6472e34dfc58010871f7171471af04e040b51f5dd88cafff3a457a28388ff7b19a27639 [...]
+TAU = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096828f002b1127895723bf927df1c94bfe3973a5b14561d891ba91b7b944aecffb27692c28dda04d5687f0810a6179974883a3a98576225f630c7c9c74f6871f1ba1fe8f770dcdad877639e77520b9a6c8244af529ee40839471db5d6b2dee86e282531c8e103d69e5df4ca53510d137ce86deea9c5604a56a71dd7c7a17bdc5f79c66949dfb3265b3eec95b68bc8d8403f796 [...]
+Z = 464928ba15c63b6f08d5239b1d9b91eaffeb3b4668762f0be8eb287d1861454a1f06d8cb805ee72d7ed7b5d3474fdb3fb2469025c346f1a0cb51d01af0363e089a34540e69a0a71cb586f564d2561caef2a99bba0e083cf463bdf75b73984052c0a24bf27fda3c3be651cd576891931dd08b8cbaccb5d7422f46057c4aaf4bc8eff51cb54724fd5ba8b3ca1fed62d26b4bd648e0015bd2bf9918b282c83b3a9e455bea38d340ca157b3c013e47d2a34ef62bec5a190cfa5afe45eb79c3c86999ad72710ec39f5df3964c3c5a670dd0a19dd7ad7a14e2861b669a2d29cdb4a67469f41c7d013c5aae6814956458999e4dfb32847a [...]
+Z1 = 637fbb5a18d8e00baabf90b48579066e27e03c0b9fc897fbf064037c32f83a1f47cdc533d4dd3ce2859c67cdd8b90c698da8fd64412f96f58e4136102dcee64e41b567a2419b08afd195c2d737c866d1fdfd6619aa84de0b2112ea001520f58b3296a18f4178c3e971f14325910e262dc323f55ab8e346adcf52e8507ca6e73eb3c00a812117f42d4f41f2c7e0a3ecb4d1855007bc20d4eee87f32e40f6edec5306b1eb49c3c0b5824ca7a2174019d36c72719ab38a87e6fd0a2f27045f583159719a5a81aa2237c793c6690fe2ac923246f6d7693d6c326be9912c0b1d547462913a4373884e9d4208e23f214d6c2f43824a96 [...]
+T = bb8643c19b8434fcfef216043629f871650fbf90ccea7a102d96b651a0324036a049fef05be922b5142057504cd3df1c63f6bc6f5de1c57f34a074b33510cbcbcaf470f9458c14e4fd794e848c8efaab24df918c33e282de303a7efed89e42a32ad87ddfa169f616f999719b2c299514b0a23dff29cabd1ec4403aff6ae61ade7344af4a75b29dd4a1a05c1b82001515a445dd3ae5e77ac25c21a0fd9a6300d62cdf713437286bcc99d7872297f970ae87a7089ea18dc15c8de5889d8e97f0ef42b23ed53e5e80612e850a98416f1bfd659a2f45bd1fb42bf72b8b8dac1d5da2bb384ae3333d2f4a125af39742648c3bedbc1aac [...]
+V = 0edf46a7de071144b25c6328a604c60704dd69b1a83b4f5510a6e8cb5bbf19fbca71d6fff8ae81ec1d992b01c6c93fceb70f2186b5e39fc0ec2ac6f16efa051a373562f7a423dcf6e252e12176da8f51c3943f7b518dc39221f1176044eedc253ee37ade89359f2881451cf38b609525f22b0d49f07bae6c412e84c5608cd039db6ed0749fdfa0c1eba50960f5b60a870c743ac6acf89ee7dd18929cc2fdb22e94ced42957fac911111bdf2ece0b37a9b0f3ebc8beba31e5f91103b4c1cfcd0dbfd9147e0c9f1871bf04b8f58f817236d2b9ea0f9aeabaf7ba6c2959808bbaf436671d4aa858f2ed28eb7f4e457f8958fef59993 [...]
+W = 83cd613a62c9c14305fb23aa439346469feb50e33956280a0a83b09706cc3dd665517cd8fe1aca403aece3edf4f7cd197d2bc70f20267c602b908281bb02cc02fc3152ed0b141e88115bdd70673d2b4dfe4b824a8ad69a9076a12c67f640a2f09d9e58b012473b3fd08309f94dc4cf860a90309a155eaea21749433a06aec29afb2dbef7cbccaf94fe7c4670d1b6ccbe9833c265bfcfa40547280693e3c644f0d05b9d1fb218f4af31142822aa0a4557a53ac42dcb2fd657548e46b819c97d408ab0dd1a9bf584453d9f4bbdecf65fd01750f4ab5cf399802cc5a22ebd038c503dbe9c72d3a8642d6336eac47a9e96c479ef9e26 [...]
+
+TEST = 8,
+X = dfc5fb45e1344db2e9a8eb7e152491e81c1fe4ef6c2d017b128e1e432c7c53aa,
+Y = 45e3c1e454c8b7311ba9c9a160f1904684d66dd05fb85274a212a6e6bd2582ad,
+C1 = 4b005935466e335fc0705dc1993364340ba5d4f02994b6cd07a246f73c838e505ec299aeadbbd375d7ddf39f1fb1d8cd35052873859d7d97c41f216dd8846419153d0ff58cfacf32183f8cb6213800d458aa3d14fd05103244472c0927d6c09d97d22a82585bd83714c7049e85d2248a896df3b41f0762d23b0e703c7ebba80e15eae83a8e18dd7fcfd30f2603004cd30ce27efbc44498b1d0ad08f5dffff9b216b7e03492e65dff972253c8f005365d8217efe5ab2359f82e5b5f58e12f5c4924e097fd9927634d0ad9e55a0455f8801f679ca37685b6414b39d0dd0be4a3f04869b0bc05af6eba0aade3fcfbc7deed54f4432 [...]
+N = b097febbee2d6126d7aa77c35a884b7d50004ec54a8db6a9a61e37a6012f29440f5acbb2fcf85d010894d74a271c00163805defd58194fdd87b8c0de780f834a08af7e11d5b56bcfa6862857101c7f094ecd0db2217e93732ba3e7e579347b9507a80cc9594dde5d35df28db3d17acfe6f2693ff07442fdf030d35d279af6a92b380c4b8ea54e5f460499b1528ed1a2008fd0a70b719b73559be8bd06fea1d56702d5b500ea6fbed0c4b39d9913cfd9140bd96e589eeebc0fb479b49a4844105f337346e4d1617e1742a93e1a39880fa9df57fa9a07f697a23cadcbc186ddc7efe02eb4becea30186de84539cd2089c2d2718af5 [...]
+H1 = a11ad7496342cb6794ac8757ccf6ccae54585dd9db767f255d6c4a3ddb92f6c559875033955817866ca1fb7e1a12f436398b1faafcc604dba8d281c4d132b6135d82f1bf3672ff4bbc316eb159ff8785a86c35acc90a756f71c38953c3aa2a4b20f9faa1f94e6b6cbc992feb1320d0ee212da3ede5f0dc8bfbb869160166b0e2ce49439a95b694efe788cb7b94c04be37ab089874e4e920b3fe9dde069f99681cd63167cf3e4ce6bdaee4a937a34fcc12e7033a172d95264c959d423d6aea171eeb5fd1a0c8c231b8e6ad411e1d116ec181ed9875a05aae1b1e085ad0aa3d3bd10c143eb9730011c5e8afd95a65797a6f409af1 [...]
+H2 = 5898d4c62f9912b22bec6c7834f8de2fb941b7345b59c038276773de783a23040a211f7c232f7a0854bcc3cc82b664a65383ef28ddbdd753a08df6545695b3fe9afece089ea08722ed00ab5cd14abcdc6841c22679e34f500dac728fc47796240a76edad04f6331a96a8b6c4695dfde001fc58fb4fb7d4c23ba8e388f9ac6eb78090c9ab3c1d806c8eeb004b22987263870385e2f51072e89df97a129173022843fbc4915c7a27c9c905ba3d117ea32740ade9ed4a21725bc61bf4ab5d01dc6961a5a8a9ea5ae1ab81d5b8f2ef2ba680c3de0047a7dbc5ae42121f0e0eb9465d47583797d997effee72196423cce04fb6a0bcc3 [...]
+NT = aa3a57faaa2d2859140344aeeb482e83770b6ea2941c4bec7780251c6bdbd2aa247dedeb19642a8cb55f03ba8d129ea4ef10314f9aa73bedafa112afec5dcf54f90e8319cf8bb80acc148bc34cc8d731237a114d9d088ddc89d419f3180a16793dd927e77258e35260d7885aaf53e7c1338ec3e068bcb8e74e244f29caf01bd3b7da0d08a12128601c353b634bc2a85874d86d2849d69987461a68b670b7d414d7c1a6e0cb1f8aef00e647032b44c993f868b6c4940ee7f0b2c5a4ad07657d9ea889bd90aadca65e845af1a3ca449409939b5df9fbf28036b59c44bdb1d24a458d15976e7905e614fbc779094b6124159255883 [...]
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000e42d1a8b3e27ec9a8ac34a85d48106cac29dcfff66e22edd100704e788fdb0c8546cd92338ecbfedd2b34e54acd3708fcdb6feb0d30579503388d3c569c25fc0004a1960d8d5cbab0236c2ae4c698994b30292cf315d7ce95c267aed6577bcfa,
+BETA = 16b54998cc5ec761bcc08d5881079c383cde2ae6a530a5c56762e5b67f7e652230cf781766813f7ccd1c9f4909d7a8fc075e75ceaa6837d844f7dfaf2d96902b4672cfc966e457aa8b80d3b380896c487e313bfba5f4957104911f1fc5231f830efe64bfb11cf3e8ef1b00b1b287c27cc628c10e9b45597c820586fef6d80598c300e2d4213199ca6801e0ac6d62fbf05561bcf98555ced2db804a1b692f2bc634829778688d0e4449b5aed6a69131d0cd651b04bc61386e501bfb1426d920eec5b5853144c917ecbcf25b99f20d1e72451fb78825c30be663208c67157c277c877b3810cb45ef965ba2ed8bde8c2c04ce44c [...]
+GAMMA = 48edab8d0d6109188cbcb641b6feaee80e1f27d033cf6d97ba72f47e61bfaa280a1a26e86613d3960aeb256d8299d17d9289e18c9bd67f14e27097f233928f03a99d8496685d69c33f3c0024ff5b1f2477190f44fb291a1342a0aafa0e5fd07db2772e4a9293584f9dc9cfa7bebb4e91f97f262874d1e970caf15324116c91bf69197387861147fc752e93220147e5e205969a262d3db441d82a2b88db5591c9c33d5d0af2edc746940e2a60d3cbc796d017e06817c3efbd586a389d561897158904fd57087ebd9083c592d34c242b2167f31d94ee424f1711140253af4ba26c5490827ff9a1143d31de6b5fe4449b72239b [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ad52da32497052ca266c500af05b9a386e70dc5f3ba52b72cfc53ee8da01e8409cfeb7b1af4b867157a40af7851ba08e4589dae87ca67d3c9e9fd5e2c16cff6019db50d216086e207ed47086c32ee06ceb8215426499a7eff28c8b3be1bff3225ee367250c91e2180805c0c5a647884b0a6f6cdc650b87e3df5430409f318e12cb140b352cdab653242674c000387accbd14a [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000000b577771c271c0b9c785a7e3ff7c6deefb768b514b56f072855e8574050191f6c09413483aec0c0685efb8f28f6ece637c9e543795effc2ff4e067f5e04704d2686c377dd8793d2246162b19cd2cfd513a470f15207eaeeb7738f49e3364b2f62d8728010d25d7597ae321985b2e6110d61480257a3e0b261cf8e2196c757a7bdba331e2f19755f61e0e444ad11b9a6a66d89d92dbae0dc313bd8a31d9351e8e8605654a0b730dc169cd5d584ccf548f26aea0620ff0cc6c0fb42e5154f230e9ce5869f39c90cdd936e5f3e2e7d6a829740ae [...]
+SIGMA = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085e7c90597027c71d6f5d53daabbf5e6d3356d126c2c383f6f33f5a2ee01946fa8a0376596861bab593b1acc855fd6715d87ecd4f3ce5787c988ee40cbbb5e3da9d5c99fb261bfab2408924e8fd7822e48bc150a9675598db1fb7a87f97e120f5f221da51869b0753d4f2441eaeae79a3c81415fab028bb28e238b3fe5a97b40a4c9802f48d6e64f94fa0a25210ea5fb2ef9 [...]
+TAU = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000515baaab7d039ff06d2649460fe1485a8e5428286af1f7830b7dd3e04b9547c16293c2f23a4eb936ac92e91466a018ff19dd13206203ee3b3500b3b233119afc7555c1885cef121b9d8e69ee4db2230b5765232c90d3bad039ef35fae2d1440c45644d5f88a23d37e18f03ae8cd95a5da72cc0271ada236bffeccfe0b105938e483e2105effebde2aadda80542ad61f65631f5 [...]
+Z = 65585dae43eb99b7de5150b9914dc43a784b6c34faeb22022f6106486f062f6689c5fa507567090c10368b5855c45b00dd05fc55b2ee47a9556dc4efa25cb129073bab51f1b2da19b98aa9468fef5249702e381f7fd14e0e93b8c21dc5cfc205e56ceba66df70a1fedfb6236e4cb509bfd1b0276207ac507467d9ecc12c924b9c83e1ef6e49861703572021308c4eac895b3613e4714770c2753f257f46191dc8808dc4d4339b07723f5cdf84ec296f0928377186dc7e9ade0f7edf554ccd17b92eea3b317042b84346ab23a6c8a179378db865775da794c47af55f665a57cf2d8e44f0e5c7e25ac3e8dfa33ee357cbdf2ed6c87 [...]
+Z1 = 1986b5ab8f8a95c31e55a2714f02194d96d45ce5deceda794863569ba3333fda1be9ab228af0c4cc051eed469a12b07c9ae1c50259f66c15c9bad00bca73079ea7112e502689264f73cebe0ad7a8ab0e08c216e8c76c44df008198cbac8f13a34b4e6968703ee5d6b2aa9e530d11db9928d26b4e5adfa65837b64532f7d342a53b1da6977addcb0400522c5341b53f978f71ce899a4cc79be8eae8d0bff4c879e1b07c17abeb10c7182db9c414bc00937ae36a58b83d5b0b457521184303fc6076ee40332b0326e095eb3ec1b71eec6eeb83c4c2f4f2d14c27cc982a9e0a04b0ed50982db8ead3866e34fecfe12614ac95579f5 [...]
+T = 17b8578b8d7ca03cbf1833228c6dfcd9ec61f544e217ab83253d14236d12fab83fcb7201c90e761311e87aa5a3453afd4c868ab64b7471005c52ca908df0c79e2ea96dc747952dcdf1005e61d51daa2cf66778f32356ad3e760fc4536f89d5012c9234e1b6e2300e0e45941a6e7926e713c64613c5fa36e2086a09c1b8d38002f2e78459541dbb24b749c49af92f69ff5ce61300d9ed5f1664a9877c2cd3944e23bb240a9dcdb0db9b80b752e6a6667e06c5e9abbf0e010b7b8ad7d249df0d7ab7950b49b5767120ba93999a29e98b5cd0a5f302f0b9511793c620f05e68537ffcc2620737f73c5e6881224e64ecdff05fa62573 [...]
+V = 1b1d1f642d4b4c36c6cc4f331814daf816ecd39add9c29913966ef5365c8c662ef033a5f787fee075844eddf3508e40a3c8b9d86ee9317ac6b3dd6247aa3f43a9fd2d1750372e5c317f3f594d2951a35b523a5e375af7a5422b268dd00ddb3823a62277bd7d8c9010e7361b76ab66169f21e255c70a558afe71c3ecf4001d5a4aea3f8d41293b8dd5875bf7a57fe6d99e9bed2774dbb2deb4bc6e43d1b75e797dac828ee457bc22049fc6e3b414501799c36fa157083040e9468b60349b582d8d9690fd9f2e618a4bbd81488ff7f551b24383cc1169b961fc7216b67d6f15ed9f84b182cb38d7b8b51cc5a2bb8c88dad83ba6de2 [...]
+W = 222c9e68b90d27405b7d7c03cf09209acc0c45619dcdded0973eeb59dd3e59acbd4d82ed8eda5c691b3e0d1d42e5d036992d94e97271f64eb842a4d69db5ed539e76a704320f536727806f5bd9deace3e4b8f9ef4ad39f133577c3dca745c8d5c65cb04ac7c5b8e3f74fcffb26d0b8fc232e1c19d0e14656e68feccb904b69b77d6dc64772a1b4f5202a6d6c544278f8ed32a825ee1e0a47b425659d989f87be8ea634774af7726bb45846c283768f110d85a5ede797ebde99bfa60232101e345aa883a23b96b62e4bdcb099a1a4028b224d700aaa833e683748e8c85d74710a6c11ed019a870b9a31931fd44efbac3bc568849d [...]
+
+TEST = 9,
+X = 17be01d433d1ecfc37388aad43419a3a06f7ec09ac03e0620e7b8b8cc8f0b834,
+Y = 01aa6a91a5d8f713b0c0fa6a2e785b58460eaf1a7ced1aa984a61167dc9d5646,
+C1 = 20896779f80aaa364005a91088d2ce94cba1193f676d92f05159662e34424ac0a05fa58fa04495f2d473ec04da530ba9b0af164852c30b26917c1e02aa573fcf18679ca3740085fd46dc5610bca4296dd6c91821d3c6f9a82cdafd3bd5514b1649b0eed446ac4f70bb4863c4141ece9cc95d51189f8853b290d3354a3566b1789ec6cc05af20cffef8cb8904b34b88e82338df1a3630b7d040831664f9b050c265e5b4a6b71a463ea9946b0cb063789a7fa4fd89b9ac8e5f8d6ce666fdfb099a81a38a970b040b9231aacaf874e195f079dc8fb5e63fa0e18c59a5425060e2747f91d72f37ee3b78565a75a05eedac473a36db2 [...]
+N = b60b7a595385beb256b753e4534f81428d3d729d02b7b0109fcdf5fde34bd9bae41b5130747129911d359520b1506111424dc267f7349dd86a5f509c28358ce21912f00bec7aeb71a3669f2be561ef257f9fce02d511513f00a92cde225097a2af4076093eb9417bb771a994063622874a3fbf7e2e953691399c8fa315a257f5f92e8170b148075456425d8cb111996b80d34e0e20f78bc7fe241f2f3a4886cf76a1cc3530f394d8cc0c50ddd5f8a8de3e9ff23705f65475cf7918dba5c9d6843d7578f732e791add75d9b9e7177c9d78a93ba2cbde603d773e3ae961b5d19db8921c655d13ffc0c123188bc4b4eef8000789261 [...]
+H1 = d1f299de7b95b84cbc4337f942faacd7c9efc70a6e68e1b13f7e907a1026ece4c359265a6b96de6d75eaf974128b9a192b3f8b4d2fa74a1d76ab0eb4fe1bfc93bbf47d06ea551919dc15f554adbe48acd721e6f2deac372d17bb16aedb078ff2d7de86d2adde807ee56158ff6dd5d07f34d1a6f16f37a07bed4a6170c78ea6038717e61a35b9371bc98732cfee76624de378dedecbbd9d3f581778befd885ed264d361c4ed44c7c8eecadb8c5d21bc6f8c00f3cd355885f66d636925bd73e895a4d2e3b77154c90be9f61cb370cd0186d3c05fd4873b5caf5efbf3dd94c9a2175cecec3710a1d1e78cbea7569f20a792085ac86 [...]
+H2 = cb236222dee3fd53de32fe71aeac7141817a85f2a0ef49a3113af219eadcbc8776b0f7c1a81634adb1409a1d09892c728667e237474b052f043117737fa7157fca0c05453393134d5930d8a9b3bda5c5708bdeba173688923910bbe72bf0c2aa3eef6bab032d3e570a6c09c0926b0124296163ebe3511d5901f31ecd1776087ec8b8d85c872e22097664ee02f15c98555b88a741968f35aefe30ea8bcc448e329d8efb75072d4fed3f72ec4fb41689277b117df00d00f668356fe9ff793f93ec737353b2e704fd5488cac6d05be4f0760b4debed9703ccffdde9cd551ab823723611cb7a7871fa94663ea7fb0e9ee9284361db3 [...]
+NT = e2d11074958171a031686ab23db36f285b0e23f889cf881e66cfaccbbb4d0800fcc9972dc3469b733f0abf4222ad4981eeb748d23d82d8d2be337315b39bb1d87fb782cb59c3c21b14b05d1ba3e080f21c91be2b6a4986e961c03b405d4ab0626f603a992e450268a857e20acf91a0bc913a1d318240cbd8a4a3562fe0f84028931a63df780e9d16f756de3cb837e30412916c0ae01a5f491de64469b7a29cae5b3030314a60ee75d4aad22e0a8c7c523324e3cf402a865815e2f7bc2d51826dbc13527b9a6702f60416d0a72178e82f0e9e06762bd3fe78d4ccfc167e563ffda9bcf7b3eeac25419704d2c7a5e194eb5710185 [...]
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000b46f908cee16eadd67527f06618536862ec81a9db8b581bd1c1114560ac508591f9e9f1a0752151b98aba7504642d4b46329829fd7a658cc559463fb2ea528dc9eb16909576dacb871bac3a5fdcfad09b78b60906b515eddf86ca2f9bfdc98d1,
+BETA = 083cf3e08335051eedaeee2d48df751d0da680967e5a3a3e205851a9caeac3090851a08402f29a92997cc08bec7190039a619c4f167a6e6130d9e9ced25074d0ce300d8bf8169620bdb3d2f5181c4df19955b5b4bf95e12fda354f5caf749a1990d3dea223e5845bfe71a73ba1d2e37cb24c2c5f47b269d86013222c6b8b882d13ddb67b51f44a057d2435bb273a61ab02a7cff425b0c21b0d867cd1459842bd00c7d1b631288c198d1ab3fdd004b8423cfaae8407b4e8a0217832bef64cad99f38bcbd91040e77c71db4bbdb317d0fb54ea162199208a1592d21999e8ce298d2fbdf04ac3708ed1fdbe5c732706123d12125 [...]
+GAMMA = 10bdacd47dd7944c145c39800004364a6c4c301e11b4ac9c7d4cb778511ee922a6770e9ddc52b431e7934664eaa72316b8bdca163e57978ba0dbce8b1f7006eae077c8e614e066e6b2eadd2eebec0da7787685e1148c90f36bd692d9e77fad8760a4e0e5066681c111fec77656e393895b83e56b1d7c26a2b2592d297d9b69c02e2010dd03fb2fd49cc96604806518708c4212315f0a2588befe0f2b65d80dd696d7da1e3218480c7697f1a58e9ba11200f09daf106d92767cfd69e2b1f92c57bc01037eebf5d8a8d4f924b6ad320133c13015c7e31f61fd2861ca06a02af76d21aa5adc0bcc054e1e62da3c82df0851ea27 [...]
+RHO = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029f54a61a6a869d28713333fc4d0ed9a6a524272273e20bfb5ad86415839ecda3311daed28c5a8fb773953320a52794933878125a5eeda5810a40cb32d9cd6ec94b5b095609dfd06f1952bb8ede14283cf28343a49c7cdc7bc318c73877405a7dd15ad261d77ffc12c24474c9174a8287031d4889de5ef36f0042b403dba42cab68f3d2ae3459490dc83241992dbf601299bf3 [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000001754e4c7d59e6ac436084a39a9e570c7a06dad40d91dfbd057cd05f70e59c170c3fe95e03099a11bab910c627bbece0b62cf9d95af574341d46f7e584a29514ce4bde8a6e872dd713fc45de062315b3990be054424ae9fb992841da17f6259240421f0ba540817d13aa9e4a9d047e29f2d31f032675e13941336a01babb13f82be41040491add8aeb21c149c05f75b5609b2f213c7c6bc1d2917ae6c8f9c4a37b222b1606d8e83abb6b512a88e6501574ae8200e71cfffd8179f3266ccc027c817c895d8cd9876525782e4329d5db98d2dc73 [...]
+SIGMA = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000522f4f5a4908f6882eb77ffebb5e86d80d3c5d387255b2498a4577db9d66633a56952df02cff1dded75a5ef015487a36d5cd457c0ef08036be4ece253accd9240ff57fbc8a34e3bfef1c7b320bf8120658a44474c1c0487d6e683e60c94b4acd3e1dd844e817f7061de8b8c2779b1da31f8e02b2180a44dee15baeef81fc5fff66fc9fad3563703ee8dd24a49e9808f1e184 [...]
+TAU = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c3328b300cc84dc33edf5f3b38e54764611c5161bc8aa1df3e03c079dec15744c1fac5db2a461ef3528e6236207ac5f3913ba2348f025ffd07b492f0a9f3083c294ab29af6ccf4ecc7c3ad5bf037c15c5fa3ee12ece31e58d9446c0315fa4d81a8b78ace4d7471deecc2aba6c317fb14cb13a5f3e5908837c0d01d58c5e85c613a6a5c60facd9c342ae311b18487423f09df7 [...]
+Z = 7b4005c745c103b4dd1b98f606983e626a3d1f0d462d500cb51001a44c915889d60e3523d808ced65a78bdc8e66071cc68fd6332e8c95f084e1e4fa36c4a9ebf5bc47fa39ada0ec6abc541773d0d8cde1af3237986b0783c8d584ea2db185fe84ed76dd586c3a37282f0ba34fb5bb31c85ec513acd7f3b7220df53b7b192c2e1778a323514fef36f2c611be9551c3984502418b86bcaf1c5d41ddebf6e9a2b6414ffc1b03c9925188ee71976dfdb1f9c363fe924c17fe2656b322d2268233ee5322a864faac1f199a3fc83ebfa706e40c1f6b95e08ced1755e33ed5a33b7bd037c17141e6ac78639d8923b7aed5947ed83816cba [...]
+Z1 = 02136f8d5a915ec5edd066b0768d970272f802c66f85f977f4d739c29cc461c0d4967019e0fc50802ef85d5d4ee9fb17dcd61fddd246d52768f9f319b470de60f4394e84b0246a1aff7eca03ed1784fb116a47034437cf0a68e3f81d4e2cb0266e41df422e3543c082434795ca57ff53b75958a5deff90d9ff0e6e047dddba4eebde91bd44fa469f5e991d0d4dbd0734709650592a67fe8f29a2e0209cd7edea2bed904bd6247c127d1709d6a46fdb737dcf680433c468984b20909a2716b75986028efc97114d755f38ef7b7ab8b8e078abadcb20edb698d81e0575cee28f661c19fa21cf40b5fd86bc64e2ce7fdd6de949365 [...]
+T = ab6f7f77a96b6c76d4cc65f59633f22edcd2eda6470e326105762dcff30b7e7ef24938914feca44bf25a5f6b60eccb3a3aea98dc77f2cb9016dba19a85f1270771b0ffa4029bd1aa981efd1cfc52751cb68bcbe23c9edf88d8ea0397fcc38e9e2b679c14e2e3ff82763d0eeac58253e33ebe27fc9a1c94b402031c88fa70c898a4c4f75032c2a12b4c583bc65c8bd2589bd03b83cab1bd35fa17b4bcd2e2a95374245089e227a30e82e77433a2eef7e2564e8dd38196d537c48920a5f4186eddb215b7ebc84016d41709c4c0a6e8ac137eeb07445ebb29620c6395c98dd2b1d28e16ed035cbc78d2ac0a07f01d3e3346d800284e [...]
+V = 3e371fb9af280771379d29c550bd8a696fe68c9f018912606f1754c4d69f536b49933e00c6c6831ec0b04eaa55b991cc9b35e52ade9c54604594910107cda832c25e8454c51844d9efa90b4ebc1fd629154a7c04168af14ce253aa8036ac612f2e51def5f8ca425c9bfc5f284f87e6f2ac29f1997aeadb6d395bbed55e339ce9a8a37d3708f29bed1d991238196166e861f5dc0e1485f6077815bf55634aaf4f1aa46a03f060a132d30d87a057cbb27c22b2e32f2d949fa984d739c56a08807a351052b448009aa6f6e843955385bc08abfe0dee69dac74a5a262cdddf54d1e03ca004465d802a15e4c242533a7b0065060ea99b [...]
+W = 3b6700fdc4aaa148252da4eb3d7a69724a748b8cd1e315135efd53e598b3adb8b3dba4105fc3d5cb8c85ec2d6732d13879a6b5ec112cee76868b5335ef1d7e78a174f5cbae9bd4d0e825c90ce812bde4ef5a844f6f887667882af251363441a7355cc40c0593100de0765ed74e6d37f35ee4dda5d590d128b04e39d30d78ea0fa11f51f7f9e2877c15d245fe8a4d2b76f522ef7f1e4aec753eb5f669e41687787863d51ceb6089b07b8ea39c26438147497ff2fefd8d7e449d7504db09f456e3e58b16f81dc9dda3c75c9cd79a0e1cfff32bbce34b63d6e0442064ef39f3f85665c10ae56fbb960647d808ef62cf3a31e47236c0 [...]
+
diff --git a/testVectors/bit_commitment/muladd_octets.json b/testVectors/bit_commitment/muladd_octets.json
new file mode 100644
index 0000000..c40ba4b
--- /dev/null
+++ b/testVectors/bit_commitment/muladd_octets.json
@@ -0,0 +1,132 @@
+[
+    {
+      "TEST": 0,
+      "S": "5fc58e951ff445e616de6e1df9930e04d09b1e01c934405ede1964cee32b05f6049d6d480c50c68f86545173dda5a1dc10b391d512a33aaf390eb4296bcdfbed6d98943aaafc4059fd0dbe8c4262c44f9dd720fb09b883170166ca8e1d96757120fb58bcdca4d3385accb5e5ca2583352125f2a6f053fecdacf62d718e605be6fbff9ddc0f258787729c1283051779cca7e215371de612dab5f363cd3c1933c8bae733fdd50fe4add3b5b646483d8db608aadb1a583bf16e65c12e68232f664509e20da400cd63e18ba63e7a81ec29efabddff1eaf651095058290d7e43379a785415b9819b9e3a063346a30d79d8f26 [...]
+      "S1": "00000000000000000000000000000000000000000000000000000000000000005f07f440d82ee7aa6a08adcce968cc329b381b8b502fde8473df58ae1df2d46f594707eb4eb5cf7b8f7f9859529051848e7ef7bfe001350fc7127b6825724000194bb4ffa89bde17c9baeeb2a81641cb7724b0c482e49fd4a148d8dcfee50814",
+      "S2": "000000000000000000000000000000000000000000000000000000000000000062f465dc11fc979148ae91e5d9f24cc708cbd8f26f4449a7c1303a09ab436702c717e654085944d41e5e6904c6dfa240c7aa81b56323b32aeaa432246af6dc8f38fa213cfd4d38a18122a9b6113fe25343f66dffb5dd48b3fcc22d17d9b9c1c2f81b4cf28bbb5f2679db355797d7a18377f7a145979791682714a3c35f3efa8bfa34ebf70f1e0b7e8711b97c373ce2b4cb1cd20bc99231aac5735858288425d0c78191b7a112cc9fcd7368f326232e5c8278a1bdac24a2cb76184eb19246e526cdccfe47cab5d81cd53ace5bccfeed1 [...]
+      "T1": "2d1d1b29aecc0f9cba5ae7f90419fe4ad630c8952b44b72db17b75aa0e77996357570a8e7bd22debdd6a64ab259ef80e365652dedcda6914ac086573f3fbf87e7f6e4f646aca134abc2bb5832bedaa320a1a13bb7a773548aacca342aae925a6b6f23e15976d4604df4fb62a80521d7c1fec820624cdd2975e28025503e01631e42b036716c59dce277af472d111042166798dd5e3d3692affa150e5fc9803459f9e15bbf1be8ac56a197b534fc616ebc92a7e117a99101d70f7679382c81c1d67170c9a7407e911f4157f67b81a812ffb0e5f348c39013776fc0d92989da97d7c76e0dad36df50f741c0a7f25c3213 [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000327b3206c02a8eee5533d964df88d884805c0bd5baf053bdbfe9f6c1abb6b0d441d62c442d9d8b0235d4f1d4648afead240753f3527bad71e95e677962380674488f5906564a94b35f1cfe95d04447dc98fdf266dfbe9dae0fc9dbe6c216cc4bc93b82e18a811219c922db6388009488afaa216662b2ce1f99bb51eae25c500a01b77b354db86d12684aefdb913baade74c19860668823dfc22e2668777af60da193f72ea1047cbfb5f6387c3aad83 [...]
+      "Z": "87a0c1c7fefb37596d7038dccdb80aa00f3b36be3059828ce213026b87b809c5ebf315d1f4b389eae2007b77ad22e9d206610cefe80243360b1079a3a89c123eccf6431cab082dcfd4e696c79bd8bcd717a4c58730bad5b6ac1d1bd6200e98be0025fc10ae337a8d4d09a6362ba4b1dcc565b3cd32ca58e75f3edcdd01a91c5970305b2cdd126c3e969f4f94051ce58f79df1d3eea40280b8230cf5ee931ea3b569925d9209a6b30a32d504ca3ee5d8d2a5a7ae239b70bc4e6e0f40a421a44a08f3db9de4d59629590a189cb81e72cc73c7f368c40f74fc25d0e61457cf13e243df664bf160b1f22344536e0a2fbcbe3 [...]
+      "Z1": "518d261cb7cc372e0232a5d964bf8299756f996526d9f1af366a0649689178a43067f969c0bda5cee59867cd636b51d1f3f5de2062744902b009733047bd9c29b76c464d1817ac3091dac57ec727e4f6ed07cd6a676507653eda0d5e29fec19b1f09133017eaf8f21878be7df19d4d2112e79dac9e12b4c2b83cea6af4d9e91fbb724a8aec6b7bd07ce8e764bebedf2c9a4dcf827810372be8ceeb9c7555519ceb08a256a5d2a452ced3adeca6402b489e949ee846d361af07c345b3f5e6176d4f46bb6a8c169bd71840d749f0199d94174defdc21b900dbb52db0157680e4bce8739d8377683ce0b2cc46cd877dd4e [...]
+      "T": "15448339385f46863ca8beaebae1e13b8ded1b8231611563ba4b1e9adb90da30a713e8055e72f55e74f08711d5a7e50f2c27dcf666a220236099b99c509b30c1cdece9084c2fe05d577a0faf161dce2c21b3867f6c8a72a9f51b738e71d468f5797b086c186703163132f2cd220b2cdec80903d184cee92087a17049990765d35f53ad7e97140e307464468ad4a88aa941aa14d082398df4b7865b5154a0c1152a72fe984531674657582a3a87bb6ca8f11a60aa2c3aa4b99d7b73cc9e9f4eebae0687ac42d4975382f6602acb6ae12da8890784eeb206bf346507c33feee60ef6b547426eeadd09df95249b730e9539 [...]
+      "V": "3b0929496a4bb53549ceeef11e191fd0a1165bcb266783b987d7282fa8eb4a362e29f3ca49c82af48e85eeaae1bedd38af812faa99ae8ea777c034800729ce300279b2db89b9b5f32d687737a32fe7d88b3457e972c25d1c1aefc9918195c8cb99d261e16d145d821aedbc04ddb2e8163bf675bc26a7f5cc55a6a5680e2f555a6e21f9f49a96c98ee71e0c13e645b0656bdad44155e98b8ce6f795092a6238d2de78e75384c1597d773fb861a61a5ea813807a68bd882dc1368bec8af1aaaed35bedcf099b443e09cf33613046287214fea27e3d8c2063b138e266bd55175b6c00bbb287a295ca8d37010c4d97e7a489 [...]
+      "W": "4ced44b4749a0c15409458aa3396a40c71e5fb6108f542d011cbe2a3cb8b061e930ac786aba7bfdba805257921d872b66a26dc12b9c97b3a5cdd9bd302967af19ff48499be387304a41113868d160773befdbb30104256d72438b4a53f71b96f90c323cfa392446860cbc7795d9315ecaaeecebe48387dca878fcf3c1f35373d3ad11c57e5d80fc79054d29f4c351dcf3e8d544f9bff17192a19f17ddf07875441d04718f1e8ead2f3ec4e3a715adaa5e5c8bfb414c2b848fdd5b68685f5fc7ceeee3b45fb048bcd3643b19e22eb57d622a618d348671275eb898b956724a227e64698d49b594faedf403bea9e7c6dc9 [...]
+    },
+    {
+      "TEST": 1,
+      "S": "5167db0c5f52a8befab92485c2f3978abe914fe0efa95bd4fb9b5d8c11d3a4b5ee4dc763736ced2d0a3ead597d99c1d539bf64e53a7c455afbad24e984518a43b9d1dddd119765ab8ae8713ced9bf34608de7c63cc83285baef93a8822462a051f07020877d87ad727b31afe4ef0fae2406ff8741b83523094b622401f3e8d9057d752bd77cd8f2c56e094297df795e3ff662f7d050be776832cbfbd96dbfb747da8af87cf8e97f6cd79b521521e8814422dae1af82295b931e2add47c194fda23802863479c579154ad35de89daff7819f2ac88a1748352a96fda8538e021457b3b95e0a4aabafd1a594798d395bc28 [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000d0304ec2be08b6d5697273f8862d1038618af12b5d1c9fef6b36661d42912d8e7c21f75a50e27ea7852f2ac4bcf70c802b0bc94225157d63c738c97a811773c2b5bdf72839591ca6a2b1d7c35b68c73da2ecf1dabbdc58f4a5659cd7e4bbbf68",
+      "S2": "000000000000000000000000000000000000000000000000000000000000000025de0aaf0c2713222e7c82a28e09be0cd1f6974fc7f2f312972e1338386d5d6b4ee95d8c7be7e17bdd794b287dc2c12f38c6d092b2505fe373e416acd5fce72858fc0e51502fbf1a72804bb5b99eb3ca2304c3a6f3ba36f1de8a3ffbfc1c1bc684d5268e7d791c5173e8d61537eca443911cc4d5521fcb6ed24fc0364d9a694e52f19ab089e6b9db5ec18476cd7774b2bbf61001cd7280afa7f9476956cdbf892bf99ca42b0b86d5e4784ec026ff28be4080f63145fa069751854d75b5c70153d9e6dc980d963f3369ba8dc66a4c10c [...]
+      "T1": "78f29f14caebd76b8b036d4919ec3b0798935d723a7e9dd43f2dddcbdf940a6884a9d3d758131282c887f158d4780c99b4c9f60a81cbc1fde660d3d97105f3089e5cb30d95973df8c8c699e7eeed29d865b36f02731ade05ad5cb9072e218ed04da1d29ab63fe633c4943c3b2af1a134cdd6c089795bf03d4009db9833ee94f758121b790532e801578647f67ea4c33903c90fd37f8beefc3bdc8ef894ab4e4b74206dd9bf08aebaf5cf5d43c865a0b08dabf2dc5eb2b24655e37bbd97831eb40f1707cca6308f38459dac94bb821f90c43b61cbe0811b4e0635d7c3057f78b8c8c3867ac02f8c1b0980222254d7177 [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fcc3b869d3058ea66b33eac52cc3570dd036c34e61f87d134bbbe2f17437ada6d79ca6b0779f3e4932e918eca0e701d1f7d3e4ea14e3a1cdcd0350426d26ca0ebc321643a5fbaa6ab5b4437462962e92843c067f640b6f70c21d929995fc0b390edc2df38f5688bf19f8a2b55f40b865235c8d4d56b934a5630b18981aeccc6a8f00eba4e311168742b7e18f853bff62e4444a3f225f0122da74ef30f73d17d0b43bf5bbc2e707ca62c98c91b30ead [...]
+      "Z": "2dff23403a720fdcfb048086b1b8ae7722b6938c9a70a51ed164a7b4da4ca665fafd544cfe04637ca6c73b16b15f34e29abc396f6a04a2d916a68cbcbf11aed40bc81bc1ed6a37d27cd6a2fe634ca61d66005d25c7b44301d4b8883d3cc9b772faa8c2319e546352c1bdcbef8687952ae2ebd99ce415cd88cf4ecc38034656eacaf02729e0344a5225fff2af134407478dd0a107c21fb714c9a7dc1fa0d9e23384e0d5948cf6eab26aad22cbb056efb07cae6ccb2902efe42a6f1cf41adc07750f99d69b332930893aac00bee6aa21755ffbc802387944a08c4e7f4851287f361583e712b3ce6171e1df4d3183a39068 [...]
+      "Z1": "0f02a7332f9e90fd155a45615bcc0505a2372a6b38f7c263fd73808ec315a434ebc9b381797faaeb8580879a9b3a7dae792c3e89e697fc961ef19e2bd7eaa6319195a50da018b21805d1ab9bae1cb47451df09d2728ad5825c48ea60f1d179561f0a6f98e9e2adeb09fd17dfaafab6c5907fb0602f6271702a7a7a25b706a3e5bf41e5d40cfc414a9ea07cd8a3aca6ace9ac85f3971c596b1830d2c3dc9513feb978934ff85f6bf8c956f545716c09086f2d9097f06e0afd2b3a2f2de762042db9e84d550b88b96b92f451bf0e73d713eefd6da91c45d73033bdc167dc982a927238d842dd668bf4d4a8c33e290ce39 [...]
+      "T": "683a66eadb1400786833e5a4edc0af9530f545e7925b1c9e4aeda26cd69453d58808666974c56adba50a8a233e36fea6493691164d354f421c5afe22affedfd4c93518838a27141af7fffecd83f829c13836e01fd5993ebe54389b644f4f178949a628bb37463b84ef0c12a2b76160cdf9a978c21f91deb8743bb627b8eceaa64b993267379b1fb4e31a22ddb3f8c1da307ae74ff20e2ecd6f2782a73f5148cbfe9f8aded87b4ca8f742f983b6f73782b7586c99efbef6aba756f442e051fd281f76d7247ec6abd30c33da9a1c15493d4e79909581b432f28e73560685ca5cf068c545bc33b5ac19159441f9241ef023 [...]
+      "V": "076e88dee5be28147d49a6c3857b4edb84f558fc36269c65a539e5a678487e0b03916b83a68802a4419bbc35fd71d7040a56f2ac9d0ca4f64a9ad5d133733e1941cbc920831c4e359ae1f288b39a2344e0038bb7b7e71a530be063e8729e06ef5e43cb2b3c95d36a3973ea50a11ce4e091e63d7a92e2fb1f0031bc8ace672ce9b9602de7af2217fa725cc938d4c2dddb17b3f653a9a759d7665fca72bc9fefc5bf0b79c94a053d5a1da863d446e0774ee52c5272e89d19cc478c6886187ba97e0fde71aec9b1ecedf933c1a8b0190653949ff53659966310b788bc33ac8ad98b63eee49a0e546791bc97594271c237d3 [...]
+      "W": "614d209b84320725ac320f6a8bb1f455b9d5b51132d85fbd5fb96045c02ed7e09dbd0de62489a454075eb5e0b17e4e964c150252699b55e1193848a130391f7990c16e99f9f6af2d5e975609bb6c40ed6fe5bdf079cd45a4a9148a6d61cfbaaa31ab307487dba39759d8bda2ea553f973fbc1cb79eef798a5022b651ff4c7b6210f317ebb2ec7f0acb2610a3591a76fa68070bbaa89d036cce76c2aa3b3b52c6f385550f28407ab25f039da6f3f9f83d24d40d418350760aefe604bf5c47af79e1ebe3662f6aece77c2cc994f65b297d353742aac70dc10d4a4acb06087e2a605220579a525d9443bcc08ce0c9c69151 [...]
+    },
+    {
+      "TEST": 2,
+      "S": "16071d56fe4b3bf5ce78d432cca203503e601fa15f97c23c18381693d2d8485173ebab434f2bcab9e9ed54b1f15e55c378e9bd618c48cb7231e1443d819e03b900c57f61e8551a1317b2e5baa3cf18409744ca23b6de6f1010506ef4fd0f8afec49b2ad826b4501cd76abd10e150b62f5ce7c0f4f5b9da2b34f4c774ecbc14eba694e667a5de0e2d959e5581b3d296068a731c3685a7a846554640988b3535cc095085f853a59195d7f4e1aef6fe95a701b846cc0eff3717e34c265a0884d31ab457b1281cd56f2b12bb20080a21df2d92a96626c88e4fbc1f5b1082e535368c732d88b97ae9628b0ea3d7be8f28671e [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000eb9e4fc521fa9ec76b9182257a5e242f9923c82482cdd3afa40a2bc31c61c40441ddbb5a7134abc3b0589fa0595f32f325f1d6a6e50f285da5c7d8fa879d40305c0be83c05312fc2d4ffea1a9225a421daf8a1c8d893aa2a1351790b7203a648",
+      "S2": "00000000000000000000000000000000000000000000000000000000000000003508fd7268fede8af271732d8e6265d0ec2f41e38c68acd6994340b00d0fe8be13c12c611d4a25af517f6026592cf37c11cc2297c1176ecea39c2b7d804560ae2694da95af61028065147dc134bee54f269592492e57cdadaa3ad4995f93480ac9439a00cf27876fb9a2b0a11c0a92c175cfddb353513711392fb4cb30f41a2f3af1539339e534b4ae060394f2ec60828111c868cdfb1697627db51d63c21effbee65ba2bdcafa4f817213c2643b07cdb8f005c58782374868df76daede8cd500b63240c41de1ca6f9c62c6b24ec57e [...]
+      "T1": "0014d327eccf5a0b5e1d17f3b961585b35c97589cb172104532700570d0a17a7acf625cb84aa850d7edf7487dd4656c129ac86ace067948ccb7b8640e6a7048d661a99381de2c48bc2326f6f586b18a4de6e1f6612186d52ce12c77b43c037dd690604458c20f1f3c4f6fe8f23babbb8f9fd3bfa69c631bf8c9c050d3045140b135a5e7d66373046efb4e5c1ecf277b40b8e28483cec084045922839a0866f32b2a057dd98c51f6187a97913f2f583102c941cc36d8bf1cb000fa93663cc6cd011f2f839f51082ec0169c4eb1812d48c10c6472d06aa7f3a5bc3f0f686faa6a0414bbc9d4f00f5fa6166609ecf3e166 [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b475a431c7a203653a336c48b695158a3d49519b32d6dd4239f1895f20e62bfd8c3aa71e3063453993f0af32c0f74455e4fdc1a7ce7a5861df01bc7ae6f17140b8d9f29cc7311254a8b6fd4554ece15c978e04693d1831881eca0c63dba2bc4a214958e4faa45eeda0b33f151ac39eaf87d35bb8012a35f3f230fd8f52ae4b03ffa693919c9b861492287af4a50fa076dca61c35be97a82efc47e8e739f6aecae5853d7f96e4695e3ded22e3fbc8c7 [...]
+      "Z": "d2be52ef2dd336419c5812a6b4104e063be0197210760ba02096f4e433bb52b00bb9eea68892045510c2b96357ed8760967816595cd146eec3158bcaa08d3bc2b8ca6083271a7e369adcba61082077ce1d6b3c9868fe4b838b463e365ef61bd9dbbbe8dcef1b268db6a145c8e54de8396536c78eb15e8cd432f7ee5f90fdc34ce2dd0abd61698dd7da251ffdfa0afae9386b38d852337a972773d717edebba35061418b7588ee0d2d9d73f075d3338c6b24dfe1e37a16fdd392dd6d8b0ea196e2b0d5986b966c00a63cc2907a4ebfa8c79dcc77a30ed31c86bed4e31cefea113a4582be6f128cda3bb7e5a3d98547790 [...]
+      "Z1": "06a4992e26b8e79abb7c63b3a8bd0b7adea7a6b05da12bc9a87967db59e6a43a4d4b3e973b7298853e1f8c1899158709092d70960b12870fd9fab51e18d53bdcf2a580fe5e0bf4ed1c03bd0d33088d485d78d5b17a44632a6b4a3531568fb56dcf472100d69664ccbc615979a7fe2679eccef32f2bdfccfe978fe4b4acdb9dbe47a9f7e9940c28a2d42b9edafcba14206246e37de4c1bc01a8be341066e2a4a4c61317241fa5951d75659e21f76df5d08d2507acb086261d355d80e6eec3f1d9b10b56e5f6aafbfd88b18968311b87f667822b2c358a51c412364a520314777ce6e9a0e6625a5873eb3ffdbabad5c90 [...]
+      "T": "a2f4aa919f9a38a335edd0ee813ecc6ccbd65447ce9f670eba2943053802915918052b68e912a485bdb35a34ad8b716b7b1973c4a3220029747dc767f35e5b181221a7f86382739f53a24f2a230904bb4c75bad2499aae502e3354e922793c5a11da4c164b490601abcb6efdcef67a1035f9b063a1c7425f848a0e8e0fe6aa11b5ed930a9f72608832d70b7ae53b8d8f2d6644e1272502f0e73b646e69c2c96f06fe19725ff07a43309348c186a077a8cf02029d1e66fbdaa079ae946cb616a184c0ea7248ffdb7e518d644ec0c50802e284fc03b8f337321a52361ffbba56f0252545e9bd3d8c0a482cde09d4b9f6b1 [...]
+      "V": "05aa1b4cbbace60a0db5bec4292faf423cd07cd98ef7a045c1f7fafa63c5ab0d6972014ed1410ebe385de77632e7c19760f1859d6c4013a9c2b780b1971269053a9b07758f2babdfba88dc320057756174a29c6730469772da4a08d85acaaa9b7ed7aaa31eacc8419fc13c5dbc7813f6e25880b0fec983f4bc01a355fcb9ba6771850d652d5d35885b632d1784725a6f5d85fe11d6aafd7705c09c1c5c74fea0ff86e44f872310d3d7ee52b07158408fde0ccdfb307ee7025699f003b7e42a2fed055b3c6d878bc8d4a1604f81ab61139c1fff1e8b442e82025cb19c8d6c5f692d328e2e86410a679898c39b33586b25 [...]
+      "W": "66ee2a4ebf6627843e4a42270e9e999f10c553572f5947b51ca2a1eb259f2d5d4f4ca3dc5f8a2b10b06d9f9743d97ec8398c88fec423df6732ca285f37567cf58ec20df11a9ed16a8360d7727423f71d20f778e722f03f5844e58a0ff2568fe8eb92110bb717d2297cb7250ad6b69ec57d7712acf5b051dccfde2c23a16419dab30b9f3fa8adce370db345f9da337daee8f70e578759c0a8eb3640872dc8f31ad7f7aedfcdd83972a51910fbf293b4e34a1f57805205e5c633010ef8524f45a46ca60471d94a515b94eee1cbb759f8e7445d3fe756d8737bfc261863e047e312e33fa9c44d0583753766a91cd48c4a00 [...]
+    },
+    {
+      "TEST": 3,
+      "S": "6ba73884bd91b90d3606a823c46e9e8435cab984b8512ca2cf18a367da75aaa606b4121c6d78b580893e770062b86a9eec7cd4d2500e3adeff3fd130b9f4d72f95f0de3f30042a41e845876f144568b7d014af4aff8f3cf80065776c18b9b9e5610f7e3e84f0ba1de2fe6ecd6736e66d18e902d5444c3a5d673291e6e483f25a67cdc7b992376c370ae226df3fb82e39628adc07a2c3f8264f481443b6debf93466fd1542a26a84dcc90c7ed8103b76d1b6358034cfb267b14f4105629744434948e875a0f73922c1a662de760428721b50fce9042f7af6fd4f85155eb59e79bbf622199b99e91c9680340641a388cff [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000b34099fb12058fc0340a43089f2f0f0097d076f5f3acb655f77812def570bae694ebe64c78e1d93add8508047f239010094c80e83c24b33836d53d7e94920bf13826be3485d2b01ca6085a3c65ec6052706ddc68006477c4d65b8968aeac4364",
+      "S2": "00000000000000000000000000000000000000000000000000000000000000001e1b0dfb8073e3ad0ca5a0ae8053972320b1176c5028f291147da886d904392d7298ca2726060f3d783edf838bda2b1659bb214795cf3fe4dcfc301e44076a74ac5c98816cf36701fea165bff1127d20d2c1550972434d1ffdff7c207db3e6aa1a74b0413fe8c1380e7eff9e38f540291ec581a81055c9fa097ce94096099aae704ca57ff7739d3003fbeef0b06c53410eb6840d7704e67c79cba4f82c9b52dde2e50f4c3b8094845b410e5109551496fbb12939a59fb1472eb1ec40e537530fca96349b86222c8130dd5ae9abc2ef8 [...]
+      "T1": "5cede2fbebd789d9c91d71aa31c35e36acb447993fcd890de826558fbe807e61f5c6700623ca83f8914ec41c600900dd6e8054133fa55eade621f4b835a71fc5fd3613edee48ecf2eb09bfeafcec923d53a31e2e7a728bb40afd61894d35eb6c88dc29c24ed132f5b3b4d7468da7c518ae765c65051ca940261868d844e0bc643154cce151d2a54fd2bf2f62254fa03bd93b202b3eaf88cb81ea893a43ae06f52d712b11f19f7201440d1cc2440d841909fdaf5584aca7ec20b9193e1a36c5596830e02252dd03b6beb334c78db396abcc59c0cda337cee3a159dc29a00f7d32c3c347cd9754517f5f179c584274dc8 [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc840f3ffa9001b362d067bfda673695b15ccffdea904135addbe70eec6a98bd3166dfb3446ac1dcf86c6512f58b5b2ab23b396e012818b77efb3f7b5349337fcb6231f5e8c4479b87ebd1243e6748a08baf57ae906a2e49ed707b83fb5d3b9a492a5d84ea35418628a323ec9a3485872eb7af527f685d0864240757cb2679e6222dda965700535da99a320c61df99445308e6b86bf26fa27f1af6db62b5d312d90f6870de5a97ca7b99a240e5f0fa [...]
+      "Z": "30a59b17c320f57b59ccf87b5cd14a9ad920383b5e69f2234b88ab3a2f93e59a514af0e6f67398eb180fcdb5dec0f97cf8543de7833fb60ea63aa31b0974b6bbb902fa0976a07cbe21cd1c3401614604e17932afa7f369c63f1458f3958f4a8062bcf2b04cdf4780b77de8271cd5a46e2c891b1e6a015845e4382738019a90a03f3485fb0655cb662cd005d1d0eeb826ca279852efcd993f597e1d58d4fade4ad4fa41180f49a8c81d4fd92f3a7ee538779430d694b5b6c5e47478b2f64623af1f04a0d0baf8bbce88363e451e10efa7906f5a082c529aca9823a74146675b7140ce4e794971f5f330e66ff33e647e06 [...]
+      "Z1": "066c60c65e9d160dcac7c11b824da17aeb3b79f54065a75bab593a3acb09f1d0a0cba843b15f962958ac9ec2b79b416751d329ce65d5d485819f90d463a81dbaea813d52f1090f8d8671e0e628767286efb653c1749539bd395b93a4c3d8c291ab46b2fe15e181d4834e2abdc94696702990131c8e9cece2e95b8c0e54e2451d2df5511015d407122fe9c2419c84a8979c09add9b0b720af8128b3d59cef48a55f5403833836e7d2ae4f3f2f67fbd8f7d364ecd2efc85958b4eb39e385bbbc935bf18b095d3608fd934107555c7c26f1f4411cb9d7e4738c1e7bc732311bbe039fd824f32d65d2c712ac07741a0eaf1 [...]
+      "T": "4a15c0390fdbff4a1f66f858d79e8ec6488352d40639a947806923cf82855d2021de7b6602c17a693067e8d09a0c3b6b840342753f90f3bc935f32c2b9c556f768779faad5aa270e36c98dc442296a7ffd2a96d67318ee663d942ec3a0ace151b176051b0636f513986148d08b3efc5d0a40e4c86955e398764e474af117689ac906f9656d3eb9d2a2f50b4ac45b815a6381202b78b1035915c487e592105e7f91690b3ee0dcb9746a04c9e07affc31e9ca8bd45c179f28b1b61e3ee3017ebddb46750956273e2b32fd3ad3aa26afff2a290ed3e61b52c179c03b12356257c229d9a59d1b4fae5f3a2e549700643a40c [...]
+      "V": "7595a4036ae12a6578ac2e88926cf411001bfdb54881804d1e08da352966e47e3f860d7e3cd95ae527bbb8b658649739189b06bbaf4bd160218ca4b75929f4da22cd59665616b3f341fae67e5d14d97987923ca3f68b875390ee5e85f3e4db5f8da9bd37a1fed024fce9ca5d261572d92d941e133f5e66858f547ab0669bda90aae1f154b6cb64748a704a28184f14331677051d8ad5bd85496caca8be2fc8a60bc721194802ef1a89ac1b9fab340867ca4260eb6dca191f7370be1cfb6de2aeac37926ffe6828f431cdbdab9c50b0503e92c27fccad435a014a4d13c58ba102673a5ee3d426e2929f23e3d38e5a3210 [...]
+      "W": "11f0499f0fb59dad598a2b6833edfc9fdbc869dcc084a478513238887ddb60c27409814c3a703c309be8fcb28bc335c372b78a5fc8c93170f5a079dcf8df861b9725e844b1b2084f7c58adefb1119948b3c81cdb86989a15546b00dabf1b42331032187a6fcd31dc3938e3bee9a5743b27aed7f5f602e3b7ce94b61c07e9e38e474f8ef8759b8c55565764e719748e257007564a83e2279cb7dc1dc3b25f4ae39f7bced22211bb9f13ca97398a34306c5d1f7ded3e7df9a778973e8ed176b2216051ab4a80d41d67bf8c60fd434c0a47e462a05648196a80298497955587fc4e0142a5c7b1e9f78acd9eee98f55d728b [...]
+    },
+    {
+      "TEST": 4,
+      "S": "6524b7e5e2c8be3120ba080787b0305fc5d57f0ed62bbd1633627cdb028c688ab21d5421080a21206a4e4a315b59519d13a6dc9ec4ff688c377d12ff1aa2e0a93c4270ff3628f669d421665223bdc988f55deb2742e5cfe08f26af76c7b852883ab3d8e39d1bb9c9d523ccae98d3449457f87216a2b8aeaebd5474b0634d7093262a9bf1d53d0133f7d997d6c8e91c02336bdc9757b5921ca4e41f84c1ff0ed868c4ff34c49cf0080b7f46af98f05fec8eeea94b143d9a97f9016c5453c8ea86b11c6c8294046bfc3381ec80b4993e2e20fa92ae8e5d7c7f2353a75e72b0bce8580fe0fc9a38239e65979e2bc13776c2 [...]
+      "S1": "00000000000000000000000000000000000000000000000000000000000000001ee2f7b2f529d628ece355d7d081d357e352d18914f4621ba26243ae49fd3dfecedd1712c649953dfabced6ff06d749d3b030b233a03be9e061186bcb214bc029bae8a32dcffc28381df48dbf8167efadf7fec23ce9681ecc7bcd0750b987432",
+      "S2": "000000000000000000000000000000000000000000000000000000000000000060327ddf33531f335d565787fcc09497d5ccf64ab23b5159400ef4f68e1b577d817249699460bf668eca41316828f8b589addc518a355ff79e52fb63546861eae48f7a2865eac05ab790b05ff9868867880cac7099f369f3d6d7ac37d3eb9d68acf0089b0522a93d049c8d5e678c726954bc78e78162ec2c162f783341a66750d9e89fb01e4640746e613c852e9003940c19bfc34a86d91484042a8e7e67ab999208e8087d101f5707eaf1821d3a8b94140b655b951a141a4e77e484128792d51dd642b87d7f783817d7516bed9315a [...]
+      "T1": "4a9869dd87d306488f91f6f2287590303eb9d9442d6f7ae5fd7085700bc6ce4538a71c1e682ac5d53ee93e471bd0fc898985ae391d80d4fb283023cbbc823fc2d75009b86e5b7e55e1147e0a0da3441f1fda0a56ff7ea9ecb799ca23b2b1e73010b198b906b379def5d352112695b039fcc47dd530f6ad1db7ff6e4582a9e9ebc75893d778b4b70bae569026b773e8fa8fc7d4947d2d462553b3933d121ad7be1d9009a65011e75190fe98f21ffe8b0f36d9da3f57fc427e70d9b88216090f3ea82a2493affddb77f43586d52c773044bbeba4328bc582cab4fe7011936ff88c3dffbf1077d9c1ca778134a2f70121e [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006743bcdfb7b2c543a212b219e34a5755fe2cd6e19a1c7a056e094d3f73f8b0b9f04c1aee53c8e63c88d7839c0d7bb016852ea1e799fb6bb82ec967d22444524aea993ea57a96a15851190eb9b32deeea25f6ddbc2ee151dd7b3d3e9dc203bc536525bfe78620ab41241d340fa8fa9d7c45a54dbe40c0a858b5c428e9346c66211fc4e3341754e62b446b6742cc8afc620c0399719e7170b3b5064ff95e963dc77ef76c11764e7a698bb757e88a29895 [...]
+      "Z": "0b716ca7b34755a1711884780e061f63d0d9820ca53251e8216dbe0f4ab0eb2ff03efc3326b9fd9428d88ed164b348ada97d80d8e83a114ff85982a16dfceb5eaa69c6fbfcc8f7c1a9ddd86a37f4c4f4bb0de4cf492326473752533efa1a121a266c597791be5f50f51d4634e17180574c22d9bc9811ee01e433b2e40e20e5d61a6817d03b4097ff1d7c09954950350d3c4ea0024def31b94e71dd117baba52d9f82c10003b2fee027d03e833ac1c82d09ca01310e04154e5f03f618da61aa4a94936d189b28b922ce81e9532f0ee87ba28d8f069588e07c2e4245367ceb8d161a59359b599a39df6376c0fb4bc917cc [...]
+      "Z1": "4942adb802be8754455293e973e6f8b561e721fad828054c7a4d0451f7bb5267487183a0284d4d34d41a8dba0cd2afe4c2fbdcc9fa1bdf381a137214abaf6265713e56f52e9d558e835269e19c41fe327f43621487ae3b8d1c5d7106d2eccd03a6ad9598e11db318ea5879a29d8bcfbe97eb66638604bc63e6c8c2e184ecd041fe429d4140758897a83516a726d0d1d62d7eff3f4fd0a128bf6668b21f675c05d21286733c8e668d0ac8edba39970df413f1b2544df7bae0638f3b9a042e34d35b3908a2e4012b2ebd95565abebd32dcde698ad630db018f673c15f3d96a568a0bb691a7cf95b6f522ff7abeedd2141 [...]
+      "T": "08902356ddd6819f5324b7e1e480a155362af2f3bfabc7a41466a878bb9d1ef3951ef8eb2bf09e3da759bc876a5b8480adc1b592bd3e417294b426d0d6a45680245980900c50edaba2e8c141555f9818b4dbe51debb36e8e922050030a0deec1ee8a57eff8fabf9fe96d428be223e43eddc3813d0ea44aea5ea0b5270dcc323732a8c231c9ce49cfc74fd3899dc9e7322d9bdc6fa66693bb40e0a6503cc3191387ef67919562184dc74d56132897807cb9fb1e8a7d4724da30ba43f55c449bdee6f50840f7b5378780ebed53c27224a0cdb1df665cf28ed091e6d48b4cf19a579348ae42f4fd33d7ed6246b8d00956b2 [...]
+      "V": "1f70670fc263ec8893283e8bce8fd74f171921d1e4af26837bb8be3aa9c45bbe7a780498b54e7402fca6e454b1fc2d6368685590a0bcf129b708549e8c3da9036868c9384a7c95c8e160034f8da877eec67d5b99aee2e614ce1f63f3cfbf728e62d28d0217392fc7124b62f5ba40ce8d2384f1c9f4ee8c755b26c95c77f8d7d5a1099ec8b7114b5762457b8564358f8d66a51181405b014819272f8874d008ca79bc2cdbe90e15b9c1fb11ae6f09eef3736fcb24de645ebd8ad179a90bfc61a4d6380430fc4da669733e2600b46af3d20964ad500c16a3d6c5ca2d6c8c63536ceca163da7b68f2edd51e96d3a4151a63 [...]
+      "W": "25aac115c8eb632904e48c4aea58fd9903a30b9d77462d01a3d42202bafdaf0cf5e8761aa46cf7bcfbd9076b2713c6b0dc0f34a1baebd80eb7efd60102d1b27b78dc9babe5be9693527a497932907292c4eb950d464678aeb3713df76624cd831ab4d81e0211137f34f882949de9f999defc24f0c23f0e56e26dbb6ce36c5304089834c5597625d017f2fc5952aa10507fde053d4d9e92a23b13f7e3ca8a432519b898bbd4e6a8be10ff9b0701f2d87b4d62a5b92c6c95564f446033d56ef50d5b92223b7cfe42dbee8ef27308190b0df9f0039538bbb2bf41daf65e7158e8d042eb7221777bea7869848986f84c1ac9 [...]
+    },
+    {
+      "TEST": 5,
+      "S": "55c231bc83373fce5346bed49a1d6c629bbfab0c54cc20e8ffb9cc3a4421cc0ef99deff1cf40b68dc3e4002518961522f175b7a5af775914aa7cb27294107ff9a8a14a476210bb9c58278a5113cceee7c330498980712dd04cfa3099e4b4fbec18b314eb4ed1ba5d13b0a75d80b8db04a1ff4ddce6ee84ac83e1a58bf152de8d011eafef3a14ad83830042c05ae46717b5cd42b4fc37294c2a2f3b7f6e23e2c236acc454481e9010a709e1145dbc1833c7316426c7b433e1532c0c221b9da51f79f037b2863d5684be2fce179463c48a97ffd2c9580928026339403fcdc52fac0298f28bd6b3394837ca9d637755328f [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000f60c092e270ac47065214ac78fb7c11fe893f9cb3723bb0e21a5f7001f025dc55769e3fee521bbedd3689a6bf73e895d1f503b4294ca9544585c8cec5a01aa6e7aef3ecaab606cec22c5d5b5eb2078440fce42a89f644a7094f10276e16c8193",
+      "S2": "00000000000000000000000000000000000000000000000000000000000000001f6d86f314956ab6eb2bfd4412b4f0cafce0530c8f9f3aca5ed7e487f046bfeaab8a104a2c831f0580319259118a8c598507a132168bc042166a76e6a43d5aee5adb9eec2c31a77573429e713f688513cfd3b2c4d639f494af1c0c6f5407fc3d66d190e514541ea81ce243672147d3005136cdbb2709e262f2c4e3423e8755061e05204d450323d28d0c5c6cd30f067c6cdf6c6f9f28471d773343d576e9592cebfcc05409e562648151956c3c5cf1b456522290475dea8e6fbcc0bf33c65c313d6b7493dbcb2ac5ebfd4b80b5cdc01 [...]
+      "T1": "4bcc473ace58e1d0c6d777cea066c896c39898bd50b26c8adb26821f03d100486a4233466141b9607cf830f3e95308aef3f243448ebda2b2c1a941105d61bf6a0da360af09965ea788fd8740634552d35900081a05e5a3764579e26d0efd6bb1005a85414d92970c89876320e0bf0f57262bc2c4e0dcf6ccba7bde39f63a18d7e8e3e2e18dd1739bab73bd3551e47c655885a80fd7d0ec01c09644e545f085015063e1c87413ccded1ab5d3d5fe47674c967187341d26dbd983f10dfa65f20a32f1ace852661ab5fdc3b1a738801398dc7bc7ced0ee97dfa3612c84bb681f2b897fcb93fab79a17fa2d5dbc322ec413 [...]
+      "T2": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d086ea787b7b5b50d1f9513ba2af13e19547e29ecf2e52b1af2c5cd5487d7344a9d03b91a56829d0fbed08bf222949cf2500e3000c2f4b2fbea083e19a4cffe75b12d69cd18ab44042079726b2618f1c36adf4523322252748a5fcd2858f16344c2c8018cce0ab2137ed47e2079fea4af998b1e06d687b89204bdeab587dbbacf2a3330ff6df0cacaad43c6f9ec53fd44f6b7f8462cf835eeea9a6102f9cf9c68b5874a270a4ae0547664c6d73b06 [...]
+      "Z": "7e7aec4f281556f4a2422cbbc348c9662bce5b1858da6f44fe7c9c2ce885961fadbe479e84ea1e10fc12db89eb86c96476f8726f5ac7ec955b2a52842e2593be220bbab65e78cbad79a1cc0fa671a9cf5bd0536327fe7ad38243a1ea5032659a392b82acb75e330f0ba577f3b53e052bfd8a58a42b357ba71ca962ce64fcfa16f6673b6dbc04274d80d9b6476a90978b60cf380a8ee111fdc1c7892fd5ed184d88043c143a39454b85ce041eef31603aa5f5325bfebbd3c9ce841b80912553a0a1077b8e3cf745ea40c2f226c2160a23eb62f9c225019274c93ef5b5e2c049906b14e17032d045a4ff6eb526302eac0b [...]
+      "Z1": "7fbef2b9dea2a8cf40c45cd98cb075c832dea4dde6a3e767197499e220a8dda3645dcf37b353ceb03bee7f174606561b25c7e086af9ac7ea11301744e70c00de843042e6992fcae6e152d41345308af60b1aecc946544e56e507a868df869d72e5e254b6096f19ae32d228567c8363eff8065c20e801570a111af391314c779438537ae4beb168fdb299ec6e64b0566c30b8573426ee59f0643c2e8d763a38e2e776c3d7f7e75a9872b4e08367df5b6f4f1272e4d85e980d8e655936bbc43ab898c28abf8afba5ac3db94cde744e738f779cf0a03c3f60e736315a12b9b254a06d4ee9d9a0a7020faadc00d242199e8 [...]
+      "T": "7d1e46d1454ef927918f16de37af576a8e34c76ca1d7e57adab6cb69a8e394320c1efec6c20e21046088638d29460fad7e9a57745ae4c7a60212a403370cf51fe0e58eca758a449f2bb2972b09883539d85afa00a5d215d8de2af8a7c5dc4237ee8d42af570296e73bc04b633fad27495fa60759f57f39e21b78ad96045ade82ea56c21ba1f621fc9b1f1c6fda67527ab5ec3f9f2c8a6c4e12a33aea62efac2ab07b3822bb182cfe4a8fd0e2f467ae5876a9eb437a8c32294ea8cf70b99e5f70e45cb3da399f6c8e032ba5bc95f11c63fabc5554404b893c868e6b96ca1b38f85f9a4273032dfc12b58598a50363993e [...]
+      "V": "18db80a6b49a462e923e9cef3e9a4233a35ac8a92bbbf7bee81866c625dd79b9c367407317f0cfb29b1daf112df609e1141c3ec3e1084bbfea0f3e62d833f91d06debc51054c102cc5963c654d3746ba5874f9cd67164dd0d33ee3c38856c3b83e996d9609592ab3ba9fb777aab1809ac9873f778b10573f2fa0a86054a53f29e84aceec83258bd5652d7bb1175128da8f3cf99d815e27ef30549eb551255aff17c751cfb03c2273ac36a462d418f09113b0bbbf5d7c874ee107f1a6cbe8ad5bec5292d4ca684438d4bf0979f913a442d10a5ab4265ad3b9845365000b886f885894e76f2cb11a5bd6e43f23bbee6930 [...]
+      "W": "43abfa017e1dd033dbc1923dfb6d6a8ba3d63e792af6a01f19893e8637c1b99c2fff8f3f1a82d98fa54f5c9e11d49f9ebcce383f6a415bb7214552998d48f5a9b91875c63fcc2d45a502176d749bac9e356f5a60ed787e9c2688bdbcb1aa7fb527aa2fbe404c2ee5fdd940c413df0f126e7b35e0f4d194d9a2a0c848091d5f8e7fd667da4e73211da6fb7d7d1ad441423f462e849614048b80dca40fd850f734946258a546d8145b121ac38f2960f6313f064c2337c700ec444b1581622ca4b1befb8dbfab7c2e1a92c06fe420cffbff46797493d34bd11b304de36cf57cedf8371f353f57aaf6b972468521d253b8f9 [...]
+    },
+    {
+      "TEST": 6,
+      "S": "1b5729a6a063824b61e46851cda758b02e903833ae6e70e8490b5c5064a8b908ebf052d9953649c1159333514a1e39965f2cbddaa76c9b848be56e0cf15f71e8d11a59de8f1f0ba3384bbf64d49e4738a6de65224c800e60d8fae91337ec9f72cbccd6b9de973d99cf6a15e0c41c67f316189b94157f4468b48ab184f82e2ea95f6b9705f55726a3cef0b40b4b2a6bac8902076fd6fabeaa85963885eae1eab147ef44b5ac4bee43d0c77b18761bec36d34870e66335f7c1a88607e4ebfce048516ae974f04a0dfafb76cc2c991f5b2a4debc3f4a82ec524c5ae9f21b22e8c74dc3d995fb9071f123f62f3f69be065e9 [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000728e55886d90d15807f56da6262c3d9b62c59eae1c8c3e4d8bfbbb4bb47a6d3eb1c9320d262abb7a7ddc5cd32b64bfc0adf38751ce2633aefa29c4715313535e32fdc25d1d937dc60247d65f56c82542a2a4e62c8c8749fef29f44a3a7efa0f9",
+      "S2": "000000000000000000000000000000000000000000000000000000000000000045926495ac7f7e374aeaddfbba3609b29c764d68958778422e8f1a5afb51dad59ebc2e4b06d1ca9774030ed9bf45491c6bcd3c0d5ab134ad52f6675a0d80c15eaeae0493353aceff96390caeaffcb3d8b96159c379d2f729daf383613935783244f43795824be8d9de37a738a09c7b5fef3fccb5eefb96aef38c0bbe71ee56ddc704778be9d4c8ab1a7c2cc4e7d61c6a893b4e44249d23bd6ac3ca7a4cbf00bdc2d570c6eb5ee52fb512376072bb92979ad985ac0f710f236b96dd2a2ac049fc42213e187c909d5790a3584dea91eba [...]
+      "T1": "1f0eb9fc446b7255ffede8fa3fffbadc28a00e8a173888b31503c6ccb3314b43797d4dffde5a8e88c604ef8287b84ea1f10f602ac2c1ddff49063652b5219d79e44786c560db6bbe13f6cabb2957292aeaf47511247f23db831af0994e945e05cdb0961dcd1d615901aefb4da29329551b4bf4779230b25d6a5f23eba2026d84e3b801876fc049c3f71a2dcf812c21b48fd9d6b9be763330ad126d7a75340035af9a8881b26fea2a55138f25aa460cf1f1dec89cf119b1c342b9a905be0cb9540cd876f7871e64b2672baa570be69add9012c538dd4120e6ca4286e34ea49bab5dd6b153ac355885134ee96b7b1b2b5 [...]
+      "T2": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be36ed6b3b79503b307c72eafd322d0a437cb3ad51310267b37cc00e5722ed7886411e99da93f25f5ae01890a4022d0c7e58d6eaec7cd3bcdce9e6d2808337d4a54b8e80f0e21393e67cffe2ae1d88c7035884c4faa04df0ad59aab3a4b6df693f3d03a7d91ce8ef1eb8121f70b63b7404d745f89fadf5ad248c42d9eafb5bc9a8ac007f2f5ebbc042685fcb4afb4faec69a518f0aa9b120129c5b61709a8aa09aefbe66f4fc273088a8cd2fbf757fc [...]
+      "Z": "848e49424407cad172f707f4b66f49e2f262dbb5625718eb6c110cdedbcf9dbd9429a428f01cf6eb4ba7ee7a8c4d004257cdfcc22f7fd478cd27e7646d0d41b9a2354a6ce7eb3ef37db740ff56747d4b6ee96addcebfb7e4cb4f99f62410f7d762f939ff8ca3beb9bf549bcfbd965a8cadc3a5678195d4f0d996a3549437635479359ee2e4ed2ab84f36a1a831cab3e1ee63c565045a9e89ee2d9209201d7554649151a60662145119932a69252d7a48e54288008698b29a950fc0f9b065971ec72fdf30236bc6c0ec83f1d8ff08a70b1617291edc817e485c5a15ad3d198aa219f65bd14303cce2eb0741935a530745 [...]
+      "Z1": "2bc674821fc549b0ac14db00203098c1887e232aa557e9f7e09948840c0bbe2fd5e73afa60cc529a4e76641b2cbcb1ad5be48d7ba19a2dc954c2f08df74f88d67fad4097e295b28db2fd8579b65b5e28e2211f247250ed89118b80ec7850d9061d12e17ebfbcc2eaf8f27a5b08c09fd93f1fa77e46c7dc611d47dc969de0004d5b9aa69f3bfa1166d4f63bbcddd05d948cd2426115e8cdbd0e64afd790b69c1e6e116db2cd061c9a10282c112823e1e0a9e988d50281e584971a67c9e644a78d91938f6f09ccc53a7d258581197e651ffe2f41600e5b800ea26b07b20577e57668a42940c24d86abad3940c992e7ad6 [...]
+      "T": "c5e26554bcbbb5070b12766e3ae2238a28cd8da26c9daa6b98a88c687b1d440337b8c05ef080c79abf62305ccf46f55496fa67e4351ccf80e099c7cb09e5bb33a946f4560f18e5286cf7d71fca250eb6d306f2ae4d4ba1513932eda027acd57fe5dcb5a2e073eadbaef3dd83d8d3eb2addba834830072b466479932db4a1e51f0fb0c442a07b4cb43899d9576ad84f04e2ba89afab35074b9c44d35ff4c2293dbec730bda2f29dd7b7676c68f6eebe25401a0d8f46f2f30c6e361cf2fd5b1a382cb590126959f40f7c747226535cbaa4390025bc285047908eeaa20fd27876dc13faf222da91b65afca3aa1142e58ad2 [...]
+      "V": "2657148a120a7657c62eb0e33a294997d2db170e23270368094dd5b0225eb49e5e3b6da0a33bd45fc65a73fc1d3fae405e9b74daa7a9ee56568849abe838ffd65f5c84d7c8c76e23e377daefaf08b29cf416b4493b7ac24f238a1e7eacef46b5742ad83a36f51ad22cb5288fe969fe82abf1dbbfb8b1db6eb4a590a7ce566a753bbe2ed73d92ecd4a8fe7e91b283db99a840d999ebfc03f1a1ad906f84b487edaed64bd1873c7a5121c319d39da046e754cac80eb2f159204872a680d2adc4a445e06727fd0a3a40720810da03d88c0bebd3214ae631a9a688261aedbbda4d8d3b3b1f09292dc6e3694352afa336873c [...]
+      "W": "0d6c30fdf059b5fbee417bcbe5c3f90645028b4101e51d9883b4796398ad0e9fdc718182968e8a5a99eb07e289065a4dd5eaa612c095fb5ddbead76135d0e034f916b4188918d7e7e66327a59edf2402cfebca0e73d16ee7c04feafe272ed7f7672d57b29365ccf7604fb23b5106e6a06797e9b641002e854be64d243fb2fc861d0ad6babfd69cbf66265eb03f844b252d982d4c912ab352d5f66401bf5efd70460218e36e972a55b4a8e8c90a304911ea1c7cd32fabb324c8909e77ff083aae8dea49da3c1ba92284a12aa0715be5ab4476249c615de09374e29e8a2d2bf2fc92cd51c166778e47844acffdbb6fa8fb [...]
+    },
+    {
+      "TEST": 7,
+      "S": "4edae479a206db64a0bdb8d2e303d4f83daed0504159ea4ab201237291b58e6c25decc6baaa2cd3710c35e513c8a67172ee966d4925044d3f089ac53fbe5a2b56d6035b17c9a37e5f1dfa48c1ee9ce27f03f251c51cfd18e6a01bb92798afde99231d37cfd3eeaae59669e093a4cb60b2b0d4bbc26cf580461b0cb7f93eb37cbdd4a83235e90c1d17bda7cb35459757c61af822cdcb87dd63f130a092c42e8497723b23db7437ec0c6a7b0f70e2dfe3aaef035f33bd1e1a47fd876ce737cddd28fdb3a15ac66aa3f883fb73c03e0386664bb1996c7f54c60cd93f09b18a4e50c445337484b05158a8b5d0052296710b9 [...]
+      "S1": "00000000000000000000000000000000000000000000000000000000000000002050dbc4af8b6e74c2668958d68b828869f92369281a6da87f2406f32c1e2e3a45598a7566530cd7f4a0aca1be8bafadd5366696c5e9b9e33dbf974b70ba25b88a8aa2becce5a1e393e1f977804ebb726a968ccd29444e7a685c26d5df55ec6c",
+      "S2": "000000000000000000000000000000000000000000000000000000000000000096a9b793f2b0e3ccc28045d4ab3c8fa10bab19a68228ae7ce843256082f81379c6cd014d637a34fb131b4d7d2899c09a9a664d80fe78af96a74aa920bdde0dc40f04f632826123bb25796d55969924391bac493be6a81c6ed23949c1d707660d7c70bebbe3564cc51432b8dde0cec4c1867431a0e835ceee2649c15f22ec917c6e36c2ecddc3bd6fec61d7c4bc4ccff2c9c00f8f3af477688885cdba4ad8cbd4b5190b6215409b5f7bf14098425c8ea6752b158b2a448339daf6562cb7a54e4c8b3131b152ca2bcea4b4d84ffdad723 [...]
+      "T1": "1818f951dffa2bfe7db7ff15b7d7d4ee3ca6401ee81deadef4896e27bf27b3db42c5d8c89ef6e68a4a07046a0518c41840d97ba1912fa9ca6ac277dfac25084849e0a46fa95bd5f907b20bc9153fcba6217f7bc8824111b54098a337661c45eca214fa7800e837080f9effc1572e1eb2d7221d483121a5466171591c44e6b4566465cd97c09f0eb70b9fdff3ebbd967682df4b760a86d102969def7bc0348f2b9840d69cd751e7e43d2e62b9bd65f511cd008db7168e7d586cfeb4e12de8aab68bbc8d133a83973ab22e37174f11e4d7cb0ae4fc6a3c933e896fab598a68f22f31b24bf11d5eec43d8933010e8a0131 [...]
+      "T2": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b569577be1a0fcdd19086182bd3b0a1db4f0a13febf76a2953e74ea0a10a26d535cadcd71b7b0aad7f5d92ef4d4d6e74657be4793af1ac29a198cb52e396461f69ee3cd973446ba38f37fb71b815f6f4ed9eb02992a2ae608d8da95e5f7af603652b487d2e72b36c239f0773bdfa46475d5156f693011c8cdee2fe5cba2e3645b55251202a8511551b63a6bbc19bae8f19ba47038e92b7cc4650c9e5b72baa4f21663928f012945f099aaa0f7c8f9 [...]
+      "Z": "581465eca378888ea2641acbeffc6718c0d1ad9f34c7f3bcbccc7b40832972b058afc898b343d21282701b2d5df058293372a6616e5aa3902d77c49b7a81710f278e68acd662c994e86572456c9410afe425c3fe3ce48530d532085237333ffeb1db693ae2b98ed73f98643cdf81cb5ec0079291f32d90f6ae075862e23afb47424ca1cdc274bbe0ce6e3a87d547207dc7cb95f8f504e7ffaf3bbe08c9fd981ba2b2d4e332f4660fd459b20e9ce267c5040aa3c06d9efcf3df3e5fc375e90bf18448a010de9d58eec9c392632fa9dc2c32e673e5e03aa0d65caa706bef9c1e9a7295ed32f62f2a27f397df9fc6f3388f [...]
+      "Z1": "50c21df59f661e4b85e17b3fd9f89ba5896ca74ad9497d6445352be18cd7571134859e3de64792583c68d1799ad498cfff4d63b3af3ea8b77e92d05d46164fc6d82ed48a638e2d0a1dd4cca00fd19b723712f7f9ac196f8f4bb4e1bc51f0bf2c4635f28bde687057a0bebef992e1b49dad396b863aca96d7fd74857e509e3dfdcf8c231cd79a66f42be99952b3cfa729343a7c1fb6b9459617deed649a5c290f51433cc2f347055a3a4fd53b48ccc2558d749ad8429d0ed2d8934cd3562f9f0abef68c69459d77132b6e1e8214b909f1540b74dc8ad375698df4f2130cfb81f2f6010dfb4277824b4dc332af751cc53 [...]
+      "T": "6480e62afb2b5f01455992f589dca4ef487fa7377c46ad396963a7c70cc54176bb6f3f4ce68f7f031f1229bd109cb45615233acdab85f6c8c848449561b601b5d377dfb67bda21abd4c4bf045b6b25341a80ae50178c89189a3496d43a49fb2b1d267179387590d8343e57cddd721a4c32e67b2ba19bbfd83e6e640a87d93740c3ccbd217acd9a379c21685815e90e26b2391e93968021c6351f85690a9f2ec934b144c1f84e12c2ac97f3f1c148e2168aa69426640b366d3eb8065730e1de4a322c4f53c1d5e26734d090c6b41cf0c4f743f4baaa0436b4010323475d06945fcb3ed7162fbb352dd8817a37625b970d [...]
+      "V": "5815c08d8b052e28b0313b5c7e010d672336722095a4347e134086698d98bfede9dd90196345cd9a3abf0352fe35c3d880eb86cf3924b5bbbf0a30a5aeef5157a7a228bf069c2e3b99ce09a7b61b09d258a3813bb65f53dd7453d0ce84a3964cb06619fcfdb1cc8d15d8d8e06fad954d1e53262ef5b8461d32eba5e717e7d8b4fc066b4b41186d6eaf6a1054470dacb00319017c67f3466fa9862d0488d7ec02edb5f9a3d275f6414ba671688fc9db8aa5fe612a858a9209a7d175e74e875c32ebfeae1109ff9a639a48a84c26345ed9db2b619bda3a1f836678582091df46f4c2a763266f66bb0f57ba90e0c7631bec [...]
+      "W": "a09a34a259925134cc3ce426a20984ede9d47de06ee114e781d087534d4cd32ca6c32947afca833f71d96dc57ed09d138b0e724979d843a8a818817ac98e88626891a32351db6511ae5e8322b0b5a6b9ea07efe686f284617419cd1370b48cde9a8fc75c8eeaa897d479e1753bd617abdf7c0480f95747743526fb342232215b84f681d335f7af85376d5a955bfa5d53d7a201feee3f99bbd323a15bb246765f03b571333c8dd028b5c21810a72b81e48cd2a62ec47e4ecaaf6415e95e0ee093f6b1f5da647efe6232d57e6a27ca8e33ecf81fa310afda254f75f29efb00c20eba247fc37ddab2e441a081e42bed427f [...]
+    },
+    {
+      "TEST": 8,
+      "S": "73e91deb57933d2ff28ff4dde0494e404004a4fc87352ae73e01468e7e0220b040cd475658c61b00a3be7a575b612e4defa27c96e80ae6275e3195c8dfcb71ff61a3f76f0618e6e2d81fb33d30349ff166b141d04d2c8719feae21135e9a947d453692f140b96eb7106b5bba07fc7536c8163188d4c95f03e9da230a470206a53d93f5b1f5f263d3a30142875029aad9b05dea43fbcb007211fd1dfba317664ec4dd3306642be8f66042a2dbcd2c29e615f0b7fa9e673c73425bb9d0f9fff4372a42eecbdd3102e5f529aa6a2a18d262879aefe7040f745967db63d80a89b7935ac81f97113780050cab545783dfefc9 [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000420d076b503e2fe6e38b163814d74b50841b879d8badf090d47fe9757bf097303fefc9c6cc9cfaa5d32ef6cb92eeb84324afd80f787c11de71908d5f235a81dc92866e75a9609ef4a59818b39359308ad5010b8fae168df7f2216829fea6a951",
+      "S2": "0000000000000000000000000000000000000000000000000000000000000000398b8302346b6e89b87c8a21559dd4cf3b33534132a025d5c66fd501e575fc1f59a3ab071396515e4ab01e4fbb6fed6ac90affa92289ecca8702565bcb1ea9a5d33370c991e8f340b58c5c5bad2eb0b3c72e8795dd226f8f7b06888c26ea4a67f60177809920440468b3f0139f4a23960c38fa233b8960202bc062e30da74259c218c57c72eb17fcd053a41eb05b47d628fa240d83730a09680aa3655104a48fd9a1259c2706beadc344b179ecd612e5409d0f9c0db1f4c0dd59299e5b5f81df1b4a71b353ee6c17d024009f52b0885 [...]
+      "T1": "2c5ad4c7fd5d44d2c2dcc926fcc800a05d54b20e77a608f268a9dd370805b30697c73ab1951a3aaf8d74cdacff50a7fbff45af9cf364ed8eb3521f0eee80cadd748d0deb4c3ad25ef7cb231b0f4e8894e0aa1705de1e41c4e5cf0a8f985718e8a5d0b66a7fb07d652d9093271dfb97350a1d0385017af40bcfaf550dcc99085a579fd17786e1dcc48223e14b18d17d81073177e9013426f5a9878f358cbcfaca2c310bdedbc675878f5085d66de043276a1510178420d4ef24b2666eaee0f9cf9990f908e3b84d43fb0cbf8959ab4071670e6e01338d15be8c3872b169e65dde90fd5388bd7996d2d5ae369b41b305d [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002453ff028ff64056f73d7de2243093c1d8f5da82a681d4b068df00e57d6c2bc3443a904eca158beb989ae60a3ba7774b963cc35afd6168fd4bb5137b1acd3769a383db66ee13a9dd38df1b04ed60755b6a542af695018313e03d13debe911deed416bf399de5428c37c1d1d2dc895ed39eb0d7998a01be7a8d1e33a836e836127c8c44bd9b8fe2cbf4a9578efc3a6574f3ece60020c23956e87fe9dea9b0b713403b4e9491715471e9cabd86cb47458 [...]
+      "Z": "639aa60a59d1511d4ce3d2e3915714e3fb6b11ba3a4b7fe2c342ac6af69e36f7a28805163627738ae9934fd69466b9d3246447516e8ff9e2f4e0c2b3704f1250eb19dc582758c220c3d783c832c44b94508bd7f0a2de9783c3b0ea1a00345a1d2919ced63b0fc6bff23398d49ae8d39840c5efaa0931c2195f88a1a7a648dfaa871c887c14b0c8f6b8246dd4394a6a8f62d2c027f36b6c22f175f7f5f5012318c6c6449f78d1d7e3fee3acbd83047ee98c8061b142242baf7f1150d01628ca32d296ab7dc31899b809a492ede862159bbfcecb20f26f6296eb8c19edac180f5595930f09bfe1c91f6c496843be80c6e2 [...]
+      "Z1": "4d93f8e5050ad52168c8bf7178504b85ca00a9235d9e31b6a657cf69f72b59ff4a1f3b6e965507ebcbfb80a3113ff6bed4cb8ef73771d2948bd5bd5663833c48ff34a2129ce543f06e8cbeb08eb1c84cbe3bb16270eac03c59f8acf8b1dcea0fc99cb2bbbbf9212b21a8f5c333f444dd77a02a0113dbde2d948c03bf50b9062474e517124869f47d8aeac362bd7568d40bb8de0e1480f51d1bd0410994c3ccbe511b6a6c54398a0551728b9b5a961e560de85c315ddf24ad493deb1ef8dd844dd827e606ecd17e2c955aa0c9c2a2c29a3fa78789c9c0a211dceece8f700f55f86463683fb4c3e11eefe7e9b03273a27 [...]
+      "T": "57a6721c86b1dc416a7c89d9c47c281689941efcfa6d99b663287696346400bec083d01ba33c655c804dae1581bb857f033d8ac86bea601b1e04f5e9b6aef6e7cbd3ca9db7a13727443a6666349e142c4c88d10c7081c2ca4ff62d0d5cc59a5a534588fb871ccc5929e7c4d15250baf17e2d4682b470be70f272a868a06e275b9974723c4682e11ad9bc8eaf9c48203fdce0d61a49fe2dd44cd3b336fc29b27b49b970e6dd3ff8ce9a6a27f35e996522eee4339e90f55bb24996b07250935a453c77d5f5330d9f5da08ce99eef43497169583f3e342d15e8a54c1c303a75381700832f6985ab78313f305e8031dbc197 [...]
+      "V": "5d4d324437dbf8f8767f793223c29713f4ecbd27c839dcbb7f67c9fd11a921ceb7377f059d21a9e31c918838e88cbc14c335b0c917f254823dbe109b7cbcb747d99906945afbd737711fa159160956fd43bb53331cf57d6649ef8a6a8b9f653b3905bde5a827bb2fbdaccd2ba432e034b186d58569f111e3356d518de5d374933b56a0656b4cc78c8e868215981f7542e44a900ed50619eedb70acc195d7897cb373467f8e2c47ec0e50e63ee3b03bc89cc8cc0a87672f0f94a5cf4e4f2abd08e536efcfaef4f9296370e5fc3d8496bf215fda482ad681afe77cc685fc79aba17c61f2c0cf9dd56d834c9fbf8ac04244 [...]
+      "W": "84296ef08de09221c33693c255d06e2ebbf4cdfcf5b22f3a0e2a503447002133bc15de4a8389b53398a8048c8a19baaca5c4ef1498d36d79f2d32ad11bdcc665442acf798e23bad9c7806d3a4fe9d696382c1c8658498166b4b477308dca95b207d7763b5492212169f9f71be7ef81c91fc9d737f586320370b9cd43058d49d748621d4507ec15fb00d7dd9a2616e3dcf1110a4e4feb08350faf29f6624e2e8bb18c93ee5a6fa5199f07292bcab5c05de39bdbf05a09385ed1a89480cd933b7c406e3c4926c6398377954db85ea520e2b8e9e3475162ba65c9623deec85bca08fae7d625bed1d581dea912d9dd952363 [...]
+    },
+    {
+      "TEST": 9,
+      "S": "acfd471ca060a060acda7b24cc1cd9965c60678d3919d29b855e71e805e0708804ff360b21765819966d2d6932b5955b0b2f086c0c77acecaf1b498cede49d4dc493b1feccb913036f09fcb2d14d5f5de9f2f6d5b02ef27704320809680f10efd19fb45b69c8cdfbdeda0f6f54b5e67424e5e538ea6c22763dc88a007339d650b0de1b8dbf0831ba58d3b5cf8290e40af198ae96bb0814e5893463d535cfc452984db399a8f3220f7599e63092045c172fae1b37cb98bc25b42c413849058e5688c8c01959e3dbade3c2c419193b904188046d10950052e4c086ea998fd43d6690c93fc45867058d0ed8797a68053e53 [...]
+      "S1": "0000000000000000000000000000000000000000000000000000000000000000247520ae5f23b8d87c9d4a45a80c1806607cec2d14189fcc3c3ad626d8faed4b80b38cf167836e865ecb72d6e903d7144a2d70b2c5bc3513a7ddfabd42bc588c6f3adb5b540e7ed33298f48d20ba62a740c519a8db90826b18da51d300df1426",
+      "S2": "0000000000000000000000000000000000000000000000000000000000000000ad2c6dd7c644e9b55d72d356bc90e3876f6bba33e7d687a321ac547f5bce586592e55795e10c9b5216aa0348d384d07916208548b09238a35b749a6081460774d804103e354399b1d24f7e4320c28573ba1e7d88575db5abdb250fd1278bc425b73917aa5ce7e7f4c63abdcc1d699cbc606ba72a393574bd86732a8993fd67c90f436294f047b592dd152c84b6c10b6c14fa78beaec36e9d7e877b4e85756d3417a941330115ec1bc1549b00e3b39c9904ea6202f48cbed82c2248ab4088feee7995af03dc375819c8f5dd9645622fe [...]
+      "T1": "af271b0f25d7783ff0af424267dee2617c3071c8ca74a97dc89691178e7618de5031ffeb666fa0db7cfdc8a5a159c33ee802791d14a7c51eca5ca38522e4b389dcbb3e6fc53feaf9693019a14248ae08781a50835cf7887bd6d19f018a7f497bd5c5ecc69381f38bd976249d8abe15290297d82ff8eeec5c44bc3b4c1180749968bfc5f49346fc0729ca08141e7a5d5cb89498a38801a8de71431fdc9fcb3fcac17ed1406cfca5f875e5fcaf5afa457dd67a428e9936b62744906c72b6fe7c078f695a6f79ebf4155dfc29c7df61dfbe26867feff57789403eb4e996561060e3672d1d56d82d8b796a4c679c00f44ef [...]
+      "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d62f5f9ab9175333b430edaaedfcecef0f63685ffe9226d8e77bca1e6aa18cdc134f86a2c94f91b28b8dd6006489d1e7a11ba83fad5a5a47b36c0e7520d0106900a325c579409440c7e4b9b70b71f18edd90c955e9ccb418dad704d5f08bf1197f80f46aa3a8ea5f30198ef75e42a4ba7a370800d1b2ed5dd45f8eb4c11c6088537bd19e7c32e3d9ec54b84b9d7214be5330fecb46e5fe542386234af4adb2e03c92f23579a3a21f87cabfb0edbcc9 [...]
+      "Z": "1965056a098e75dd190abc3def1fcc070e7d9dc7f38688510f5f6924cf0959567a03519a33358e9e653d6f270e48d21539bfb609604df55f5ad215599b44e67915322c8e437b348ac2cd7e2b89826d45114dda26616514e152ee7207442a0ce5e2e6ba2fbaf58a059ca8a30d65f7b3c045ea608672b7b380433c24ff40e1ac1058bd66398cd3059e3a20a952527f2f7402ce8351a0c8c3cf164630358aac5ec4fc0a81a8aa1dd7059a5c9ff2e261871ca3cc8b2570c13356f09220ad70cf26919cab4f44890b8232f7857685233ff1583c02b45b182d76a270776d44ca0e73437d8bc8df3bfd2f7af8ff8075d7f21e07 [...]
+      "Z1": "538798e96dbab089bcca85c2288cdf1b2ef4ca677b5de1c8571bdc37549e8a53eadfb388bf493164a8ba2d0e428bf82244391aa191fadbdb22c53a9372ddeefa3fe02151b54a1118e80ef6871719022efce873cd29ef047e71d8fdc6345cf2bb2dc344a1b6d2b9cf4fa21af0436c0329e06c092dbb657b842d4ddbf2b321d18bdb5ab03c517ac3bdfb5ffa26f0bcc173c6c9d5d096429a119b319008c6392580afdd496a8f40134cb449c538b7a67e94e046f097e1a5d7d10f737b3410bca5f7a560e2120e2996445940538d1f7aee439a8b3442bae03acf2c429f3808c6f033316b49896f51f7505a7e87a27c4465d [...]
+      "T": "66600d85eeffdf92b46e0e74b3d376c160b05acc688227f11f5285ae8bd1d016c3a2ef01b2427b2303ab6b0676bd34bab0bbf3a79a82cb6308e630d7eff6b5f8b110ad33e5a2a86e08058bfa9d2ea07a3a8f83c3c2641b10c3024c78c9f71728d84e5cc2ba2681f7a46f6fbcbc614c3123fcab4ecae9cc9a96c242e10ece4fd17bbf3e297014003a3e0e1ff52a3eddb7f07703b22010f0ff39740034ac1ca090b044ff15b46ada1920142a070704897a01383453d2d3a8fbb77c763a3ad2c314bf58e77aee1b308dc5cd18ec0ba7c27da013db3ea867abb9ab7298f12fae85bdd2b01f6788d965b5f7297b9c36a45aa3 [...]
+      "V": "73be2e13f6d993820c87a93c79a45a5fccf9ecb61248810637789f08fde49b05979647b96b998dc79bcfa66f4d6a4ff074f2c5361b228511a4c6e90518fe0bea2759493cfd9e2d3f033bce4a3adb3ce5ecb5e6ddadb35b237b8e97568a31c2c725598201f680305ed3953ad78541f00dd55c0aa9ee1dced28b5cac8e2c8ac9d36e87c8c3c793ad7e6986e7e79c6695e1d76e10057039a9719d3b215788c0442530ff3744812a2eceb54944783be8bb586094569b0d26a77df59c6b588062022a6c21e60936b239c4564960dddf3e5f9723cbffd26fb15050cbfe250a2809cebfd6690e089debc155ec12dc64147aba4e [...]
+      "W": "a6ffd46910f64358109f7703b12e14f323345156df5d51827f58650d2aada1ab7acbb64736b1c18606f794a60f706bc776b142f16aab47c17f45fc232733170c4b4a9ce37d3030096441246a1a44b2361ef9acafd21b5242cdfebae8e4da810e17483bb7e9fc7d6d653093c5c021338b9f0b176ebe008b93f019516ebcb9ae124fef356c152c2b39b7a696370dc179484fb6efcb1fa62020d7bd81e7da4dd457caf96ea958cbce70b0c464e5becbaf0efb5e01d87a2b2a78d4f382bdb054b5deab5c18c584fa6c62bd1f14e5dd4aa27bdce57cb0035e9c2a8aa7655358de0fbd9814abcc48a283fb60d525c6798cc335 [...]
+    }
+  ]
\ No newline at end of file
diff --git a/testVectors/bit_commitment/muladd_octets.txt b/testVectors/bit_commitment/muladd_octets.txt
new file mode 100644
index 0000000..3cac61c
--- /dev/null
+++ b/testVectors/bit_commitment/muladd_octets.txt
@@ -0,0 +1,120 @@
+TEST = 0,
+S = 5fc58e951ff445e616de6e1df9930e04d09b1e01c934405ede1964cee32b05f6049d6d480c50c68f86545173dda5a1dc10b391d512a33aaf390eb4296bcdfbed6d98943aaafc4059fd0dbe8c4262c44f9dd720fb09b883170166ca8e1d96757120fb58bcdca4d3385accb5e5ca2583352125f2a6f053fecdacf62d718e605be6fbff9ddc0f258787729c1283051779cca7e215371de612dab5f363cd3c1933c8bae733fdd50fe4add3b5b646483d8db608aadb1a583bf16e65c12e68232f664509e20da400cd63e18ba63e7a81ec29efabddff1eaf651095058290d7e43379a785415b9819b9e3a063346a30d79d8f260c3e8850 [...]
+S1 = 00000000000000000000000000000000000000000000000000000000000000005f07f440d82ee7aa6a08adcce968cc329b381b8b502fde8473df58ae1df2d46f594707eb4eb5cf7b8f7f9859529051848e7ef7bfe001350fc7127b6825724000194bb4ffa89bde17c9baeeb2a81641cb7724b0c482e49fd4a148d8dcfee50814,
+S2 = 000000000000000000000000000000000000000000000000000000000000000062f465dc11fc979148ae91e5d9f24cc708cbd8f26f4449a7c1303a09ab436702c717e654085944d41e5e6904c6dfa240c7aa81b56323b32aeaa432246af6dc8f38fa213cfd4d38a18122a9b6113fe25343f66dffb5dd48b3fcc22d17d9b9c1c2f81b4cf28bbb5f2679db355797d7a18377f7a145979791682714a3c35f3efa8bfa34ebf70f1e0b7e8711b97c373ce2b4cb1cd20bc99231aac5735858288425d0c78191b7a112cc9fcd7368f326232e5c8278a1bdac24a2cb76184eb19246e526cdccfe47cab5d81cd53ace5bccfeed1e4cf319c [...]
+T1 = 2d1d1b29aecc0f9cba5ae7f90419fe4ad630c8952b44b72db17b75aa0e77996357570a8e7bd22debdd6a64ab259ef80e365652dedcda6914ac086573f3fbf87e7f6e4f646aca134abc2bb5832bedaa320a1a13bb7a773548aacca342aae925a6b6f23e15976d4604df4fb62a80521d7c1fec820624cdd2975e28025503e01631e42b036716c59dce277af472d111042166798dd5e3d3692affa150e5fc9803459f9e15bbf1be8ac56a197b534fc616ebc92a7e117a99101d70f7679382c81c1d67170c9a7407e911f4157f67b81a812ffb0e5f348c39013776fc0d92989da97d7c76e0dad36df50f741c0a7f25c32130580aa35 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000327b3206c02a8eee5533d964df88d884805c0bd5baf053bdbfe9f6c1abb6b0d441d62c442d9d8b0235d4f1d4648afead240753f3527bad71e95e677962380674488f5906564a94b35f1cfe95d04447dc98fdf266dfbe9dae0fc9dbe6c216cc4bc93b82e18a811219c922db6388009488afaa216662b2ce1f99bb51eae25c500a01b77b354db86d12684aefdb913baade74c19860668823dfc22e2668777af60da193f72ea1047cbfb5f6387c3aad83a8b7f822 [...]
+Z = 87a0c1c7fefb37596d7038dccdb80aa00f3b36be3059828ce213026b87b809c5ebf315d1f4b389eae2007b77ad22e9d206610cefe80243360b1079a3a89c123eccf6431cab082dcfd4e696c79bd8bcd717a4c58730bad5b6ac1d1bd6200e98be0025fc10ae337a8d4d09a6362ba4b1dcc565b3cd32ca58e75f3edcdd01a91c5970305b2cdd126c3e969f4f94051ce58f79df1d3eea40280b8230cf5ee931ea3b569925d9209a6b30a32d504ca3ee5d8d2a5a7ae239b70bc4e6e0f40a421a44a08f3db9de4d59629590a189cb81e72cc73c7f368c40f74fc25d0e61457cf13e243df664bf160b1f22344536e0a2fbcbe388c28c57 [...]
+Z1 = 518d261cb7cc372e0232a5d964bf8299756f996526d9f1af366a0649689178a43067f969c0bda5cee59867cd636b51d1f3f5de2062744902b009733047bd9c29b76c464d1817ac3091dac57ec727e4f6ed07cd6a676507653eda0d5e29fec19b1f09133017eaf8f21878be7df19d4d2112e79dac9e12b4c2b83cea6af4d9e91fbb724a8aec6b7bd07ce8e764bebedf2c9a4dcf827810372be8ceeb9c7555519ceb08a256a5d2a452ced3adeca6402b489e949ee846d361af07c345b3f5e6176d4f46bb6a8c169bd71840d749f0199d94174defdc21b900dbb52db0157680e4bce8739d8377683ce0b2cc46cd877dd4e7591dbfc [...]
+T = 15448339385f46863ca8beaebae1e13b8ded1b8231611563ba4b1e9adb90da30a713e8055e72f55e74f08711d5a7e50f2c27dcf666a220236099b99c509b30c1cdece9084c2fe05d577a0faf161dce2c21b3867f6c8a72a9f51b738e71d468f5797b086c186703163132f2cd220b2cdec80903d184cee92087a17049990765d35f53ad7e97140e307464468ad4a88aa941aa14d082398df4b7865b5154a0c1152a72fe984531674657582a3a87bb6ca8f11a60aa2c3aa4b99d7b73cc9e9f4eebae0687ac42d4975382f6602acb6ae12da8890784eeb206bf346507c33feee60ef6b547426eeadd09df95249b730e953996e38319 [...]
+V = 3b0929496a4bb53549ceeef11e191fd0a1165bcb266783b987d7282fa8eb4a362e29f3ca49c82af48e85eeaae1bedd38af812faa99ae8ea777c034800729ce300279b2db89b9b5f32d687737a32fe7d88b3457e972c25d1c1aefc9918195c8cb99d261e16d145d821aedbc04ddb2e8163bf675bc26a7f5cc55a6a5680e2f555a6e21f9f49a96c98ee71e0c13e645b0656bdad44155e98b8ce6f795092a6238d2de78e75384c1597d773fb861a61a5ea813807a68bd882dc1368bec8af1aaaed35bedcf099b443e09cf33613046287214fea27e3d8c2063b138e266bd55175b6c00bbb287a295ca8d37010c4d97e7a489c28c27b8 [...]
+W = 4ced44b4749a0c15409458aa3396a40c71e5fb6108f542d011cbe2a3cb8b061e930ac786aba7bfdba805257921d872b66a26dc12b9c97b3a5cdd9bd302967af19ff48499be387304a41113868d160773befdbb30104256d72438b4a53f71b96f90c323cfa392446860cbc7795d9315ecaaeecebe48387dca878fcf3c1f35373d3ad11c57e5d80fc79054d29f4c351dcf3e8d544f9bff17192a19f17ddf07875441d04718f1e8ead2f3ec4e3a715adaa5e5c8bfb414c2b848fdd5b68685f5fc7ceeee3b45fb048bcd3643b19e22eb57d622a618d348671275eb898b956724a227e64698d49b594faedf403bea9e7c6dc9d4d5c97a [...]
+
+TEST = 1,
+S = 5167db0c5f52a8befab92485c2f3978abe914fe0efa95bd4fb9b5d8c11d3a4b5ee4dc763736ced2d0a3ead597d99c1d539bf64e53a7c455afbad24e984518a43b9d1dddd119765ab8ae8713ced9bf34608de7c63cc83285baef93a8822462a051f07020877d87ad727b31afe4ef0fae2406ff8741b83523094b622401f3e8d9057d752bd77cd8f2c56e094297df795e3ff662f7d050be776832cbfbd96dbfb747da8af87cf8e97f6cd79b521521e8814422dae1af82295b931e2add47c194fda23802863479c579154ad35de89daff7819f2ac88a1748352a96fda8538e021457b3b95e0a4aabafd1a594798d395bc2828922329 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000d0304ec2be08b6d5697273f8862d1038618af12b5d1c9fef6b36661d42912d8e7c21f75a50e27ea7852f2ac4bcf70c802b0bc94225157d63c738c97a811773c2b5bdf72839591ca6a2b1d7c35b68c73da2ecf1dabbdc58f4a5659cd7e4bbbf68,
+S2 = 000000000000000000000000000000000000000000000000000000000000000025de0aaf0c2713222e7c82a28e09be0cd1f6974fc7f2f312972e1338386d5d6b4ee95d8c7be7e17bdd794b287dc2c12f38c6d092b2505fe373e416acd5fce72858fc0e51502fbf1a72804bb5b99eb3ca2304c3a6f3ba36f1de8a3ffbfc1c1bc684d5268e7d791c5173e8d61537eca443911cc4d5521fcb6ed24fc0364d9a694e52f19ab089e6b9db5ec18476cd7774b2bbf61001cd7280afa7f9476956cdbf892bf99ca42b0b86d5e4784ec026ff28be4080f63145fa069751854d75b5c70153d9e6dc980d963f3369ba8dc66a4c10c80cfc332 [...]
+T1 = 78f29f14caebd76b8b036d4919ec3b0798935d723a7e9dd43f2dddcbdf940a6884a9d3d758131282c887f158d4780c99b4c9f60a81cbc1fde660d3d97105f3089e5cb30d95973df8c8c699e7eeed29d865b36f02731ade05ad5cb9072e218ed04da1d29ab63fe633c4943c3b2af1a134cdd6c089795bf03d4009db9833ee94f758121b790532e801578647f67ea4c33903c90fd37f8beefc3bdc8ef894ab4e4b74206dd9bf08aebaf5cf5d43c865a0b08dabf2dc5eb2b24655e37bbd97831eb40f1707cca6308f38459dac94bb821f90c43b61cbe0811b4e0635d7c3057f78b8c8c3867ac02f8c1b0980222254d7177858c78fc [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fcc3b869d3058ea66b33eac52cc3570dd036c34e61f87d134bbbe2f17437ada6d79ca6b0779f3e4932e918eca0e701d1f7d3e4ea14e3a1cdcd0350426d26ca0ebc321643a5fbaa6ab5b4437462962e92843c067f640b6f70c21d929995fc0b390edc2df38f5688bf19f8a2b55f40b865235c8d4d56b934a5630b18981aeccc6a8f00eba4e311168742b7e18f853bff62e4444a3f225f0122da74ef30f73d17d0b43bf5bbc2e707ca62c98c91b30ead23afaca3 [...]
+Z = 2dff23403a720fdcfb048086b1b8ae7722b6938c9a70a51ed164a7b4da4ca665fafd544cfe04637ca6c73b16b15f34e29abc396f6a04a2d916a68cbcbf11aed40bc81bc1ed6a37d27cd6a2fe634ca61d66005d25c7b44301d4b8883d3cc9b772faa8c2319e546352c1bdcbef8687952ae2ebd99ce415cd88cf4ecc38034656eacaf02729e0344a5225fff2af134407478dd0a107c21fb714c9a7dc1fa0d9e23384e0d5948cf6eab26aad22cbb056efb07cae6ccb2902efe42a6f1cf41adc07750f99d69b332930893aac00bee6aa21755ffbc802387944a08c4e7f4851287f361583e712b3ce6171e1df4d3183a39068f8a3d73d [...]
+Z1 = 0f02a7332f9e90fd155a45615bcc0505a2372a6b38f7c263fd73808ec315a434ebc9b381797faaeb8580879a9b3a7dae792c3e89e697fc961ef19e2bd7eaa6319195a50da018b21805d1ab9bae1cb47451df09d2728ad5825c48ea60f1d179561f0a6f98e9e2adeb09fd17dfaafab6c5907fb0602f6271702a7a7a25b706a3e5bf41e5d40cfc414a9ea07cd8a3aca6ace9ac85f3971c596b1830d2c3dc9513feb978934ff85f6bf8c956f545716c09086f2d9097f06e0afd2b3a2f2de762042db9e84d550b88b96b92f451bf0e73d713eefd6da91c45d73033bdc167dc982a927238d842dd668bf4d4a8c33e290ce393f2e300a [...]
+T = 683a66eadb1400786833e5a4edc0af9530f545e7925b1c9e4aeda26cd69453d58808666974c56adba50a8a233e36fea6493691164d354f421c5afe22affedfd4c93518838a27141af7fffecd83f829c13836e01fd5993ebe54389b644f4f178949a628bb37463b84ef0c12a2b76160cdf9a978c21f91deb8743bb627b8eceaa64b993267379b1fb4e31a22ddb3f8c1da307ae74ff20e2ecd6f2782a73f5148cbfe9f8aded87b4ca8f742f983b6f73782b7586c99efbef6aba756f442e051fd281f76d7247ec6abd30c33da9a1c15493d4e79909581b432f28e73560685ca5cf068c545bc33b5ac19159441f9241ef023eced1a52 [...]
+V = 076e88dee5be28147d49a6c3857b4edb84f558fc36269c65a539e5a678487e0b03916b83a68802a4419bbc35fd71d7040a56f2ac9d0ca4f64a9ad5d133733e1941cbc920831c4e359ae1f288b39a2344e0038bb7b7e71a530be063e8729e06ef5e43cb2b3c95d36a3973ea50a11ce4e091e63d7a92e2fb1f0031bc8ace672ce9b9602de7af2217fa725cc938d4c2dddb17b3f653a9a759d7665fca72bc9fefc5bf0b79c94a053d5a1da863d446e0774ee52c5272e89d19cc478c6886187ba97e0fde71aec9b1ecedf933c1a8b0190653949ff53659966310b788bc33ac8ad98b63eee49a0e546791bc97594271c237d374dfd6ef [...]
+W = 614d209b84320725ac320f6a8bb1f455b9d5b51132d85fbd5fb96045c02ed7e09dbd0de62489a454075eb5e0b17e4e964c150252699b55e1193848a130391f7990c16e99f9f6af2d5e975609bb6c40ed6fe5bdf079cd45a4a9148a6d61cfbaaa31ab307487dba39759d8bda2ea553f973fbc1cb79eef798a5022b651ff4c7b6210f317ebb2ec7f0acb2610a3591a76fa68070bbaa89d036cce76c2aa3b3b52c6f385550f28407ab25f039da6f3f9f83d24d40d418350760aefe604bf5c47af79e1ebe3662f6aece77c2cc994f65b297d353742aac70dc10d4a4acb06087e2a605220579a525d9443bcc08ce0c9c69151b9f025b2 [...]
+
+TEST = 2,
+S = 16071d56fe4b3bf5ce78d432cca203503e601fa15f97c23c18381693d2d8485173ebab434f2bcab9e9ed54b1f15e55c378e9bd618c48cb7231e1443d819e03b900c57f61e8551a1317b2e5baa3cf18409744ca23b6de6f1010506ef4fd0f8afec49b2ad826b4501cd76abd10e150b62f5ce7c0f4f5b9da2b34f4c774ecbc14eba694e667a5de0e2d959e5581b3d296068a731c3685a7a846554640988b3535cc095085f853a59195d7f4e1aef6fe95a701b846cc0eff3717e34c265a0884d31ab457b1281cd56f2b12bb20080a21df2d92a96626c88e4fbc1f5b1082e535368c732d88b97ae9628b0ea3d7be8f28671e316796e8 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000eb9e4fc521fa9ec76b9182257a5e242f9923c82482cdd3afa40a2bc31c61c40441ddbb5a7134abc3b0589fa0595f32f325f1d6a6e50f285da5c7d8fa879d40305c0be83c05312fc2d4ffea1a9225a421daf8a1c8d893aa2a1351790b7203a648,
+S2 = 00000000000000000000000000000000000000000000000000000000000000003508fd7268fede8af271732d8e6265d0ec2f41e38c68acd6994340b00d0fe8be13c12c611d4a25af517f6026592cf37c11cc2297c1176ecea39c2b7d804560ae2694da95af61028065147dc134bee54f269592492e57cdadaa3ad4995f93480ac9439a00cf27876fb9a2b0a11c0a92c175cfddb353513711392fb4cb30f41a2f3af1539339e534b4ae060394f2ec60828111c868cdfb1697627db51d63c21effbee65ba2bdcafa4f817213c2643b07cdb8f005c58782374868df76daede8cd500b63240c41de1ca6f9c62c6b24ec57e1123723d [...]
+T1 = 0014d327eccf5a0b5e1d17f3b961585b35c97589cb172104532700570d0a17a7acf625cb84aa850d7edf7487dd4656c129ac86ace067948ccb7b8640e6a7048d661a99381de2c48bc2326f6f586b18a4de6e1f6612186d52ce12c77b43c037dd690604458c20f1f3c4f6fe8f23babbb8f9fd3bfa69c631bf8c9c050d3045140b135a5e7d66373046efb4e5c1ecf277b40b8e28483cec084045922839a0866f32b2a057dd98c51f6187a97913f2f583102c941cc36d8bf1cb000fa93663cc6cd011f2f839f51082ec0169c4eb1812d48c10c6472d06aa7f3a5bc3f0f686faa6a0414bbc9d4f00f5fa6166609ecf3e166474fa7d4 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b475a431c7a203653a336c48b695158a3d49519b32d6dd4239f1895f20e62bfd8c3aa71e3063453993f0af32c0f74455e4fdc1a7ce7a5861df01bc7ae6f17140b8d9f29cc7311254a8b6fd4554ece15c978e04693d1831881eca0c63dba2bc4a214958e4faa45eeda0b33f151ac39eaf87d35bb8012a35f3f230fd8f52ae4b03ffa693919c9b861492287af4a50fa076dca61c35be97a82efc47e8e739f6aecae5853d7f96e4695e3ded22e3fbc8c720de0658 [...]
+Z = d2be52ef2dd336419c5812a6b4104e063be0197210760ba02096f4e433bb52b00bb9eea68892045510c2b96357ed8760967816595cd146eec3158bcaa08d3bc2b8ca6083271a7e369adcba61082077ce1d6b3c9868fe4b838b463e365ef61bd9dbbbe8dcef1b268db6a145c8e54de8396536c78eb15e8cd432f7ee5f90fdc34ce2dd0abd61698dd7da251ffdfa0afae9386b38d852337a972773d717edebba35061418b7588ee0d2d9d73f075d3338c6b24dfe1e37a16fdd392dd6d8b0ea196e2b0d5986b966c00a63cc2907a4ebfa8c79dcc77a30ed31c86bed4e31cefea113a4582be6f128cda3bb7e5a3d98547790135799c4 [...]
+Z1 = 06a4992e26b8e79abb7c63b3a8bd0b7adea7a6b05da12bc9a87967db59e6a43a4d4b3e973b7298853e1f8c1899158709092d70960b12870fd9fab51e18d53bdcf2a580fe5e0bf4ed1c03bd0d33088d485d78d5b17a44632a6b4a3531568fb56dcf472100d69664ccbc615979a7fe2679eccef32f2bdfccfe978fe4b4acdb9dbe47a9f7e9940c28a2d42b9edafcba14206246e37de4c1bc01a8be341066e2a4a4c61317241fa5951d75659e21f76df5d08d2507acb086261d355d80e6eec3f1d9b10b56e5f6aafbfd88b18968311b87f667822b2c358a51c412364a520314777ce6e9a0e6625a5873eb3ffdbabad5c90f015f5f0 [...]
+T = a2f4aa919f9a38a335edd0ee813ecc6ccbd65447ce9f670eba2943053802915918052b68e912a485bdb35a34ad8b716b7b1973c4a3220029747dc767f35e5b181221a7f86382739f53a24f2a230904bb4c75bad2499aae502e3354e922793c5a11da4c164b490601abcb6efdcef67a1035f9b063a1c7425f848a0e8e0fe6aa11b5ed930a9f72608832d70b7ae53b8d8f2d6644e1272502f0e73b646e69c2c96f06fe19725ff07a43309348c186a077a8cf02029d1e66fbdaa079ae946cb616a184c0ea7248ffdb7e518d644ec0c50802e284fc03b8f337321a52361ffbba56f0252545e9bd3d8c0a482cde09d4b9f6b1a10ac0bb [...]
+V = 05aa1b4cbbace60a0db5bec4292faf423cd07cd98ef7a045c1f7fafa63c5ab0d6972014ed1410ebe385de77632e7c19760f1859d6c4013a9c2b780b1971269053a9b07758f2babdfba88dc320057756174a29c6730469772da4a08d85acaaa9b7ed7aaa31eacc8419fc13c5dbc7813f6e25880b0fec983f4bc01a355fcb9ba6771850d652d5d35885b632d1784725a6f5d85fe11d6aafd7705c09c1c5c74fea0ff86e44f872310d3d7ee52b07158408fde0ccdfb307ee7025699f003b7e42a2fed055b3c6d878bc8d4a1604f81ab61139c1fff1e8b442e82025cb19c8d6c5f692d328e2e86410a679898c39b33586b25bfdfb579 [...]
+W = 66ee2a4ebf6627843e4a42270e9e999f10c553572f5947b51ca2a1eb259f2d5d4f4ca3dc5f8a2b10b06d9f9743d97ec8398c88fec423df6732ca285f37567cf58ec20df11a9ed16a8360d7727423f71d20f778e722f03f5844e58a0ff2568fe8eb92110bb717d2297cb7250ad6b69ec57d7712acf5b051dccfde2c23a16419dab30b9f3fa8adce370db345f9da337daee8f70e578759c0a8eb3640872dc8f31ad7f7aedfcdd83972a51910fbf293b4e34a1f57805205e5c633010ef8524f45a46ca60471d94a515b94eee1cbb759f8e7445d3fe756d8737bfc261863e047e312e33fa9c44d0583753766a91cd48c4a00dbe9ba2b [...]
+
+TEST = 3,
+S = 6ba73884bd91b90d3606a823c46e9e8435cab984b8512ca2cf18a367da75aaa606b4121c6d78b580893e770062b86a9eec7cd4d2500e3adeff3fd130b9f4d72f95f0de3f30042a41e845876f144568b7d014af4aff8f3cf80065776c18b9b9e5610f7e3e84f0ba1de2fe6ecd6736e66d18e902d5444c3a5d673291e6e483f25a67cdc7b992376c370ae226df3fb82e39628adc07a2c3f8264f481443b6debf93466fd1542a26a84dcc90c7ed8103b76d1b6358034cfb267b14f4105629744434948e875a0f73922c1a662de760428721b50fce9042f7af6fd4f85155eb59e79bbf622199b99e91c9680340641a388cfffae3bdab [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000b34099fb12058fc0340a43089f2f0f0097d076f5f3acb655f77812def570bae694ebe64c78e1d93add8508047f239010094c80e83c24b33836d53d7e94920bf13826be3485d2b01ca6085a3c65ec6052706ddc68006477c4d65b8968aeac4364,
+S2 = 00000000000000000000000000000000000000000000000000000000000000001e1b0dfb8073e3ad0ca5a0ae8053972320b1176c5028f291147da886d904392d7298ca2726060f3d783edf838bda2b1659bb214795cf3fe4dcfc301e44076a74ac5c98816cf36701fea165bff1127d20d2c1550972434d1ffdff7c207db3e6aa1a74b0413fe8c1380e7eff9e38f540291ec581a81055c9fa097ce94096099aae704ca57ff7739d3003fbeef0b06c53410eb6840d7704e67c79cba4f82c9b52dde2e50f4c3b8094845b410e5109551496fbb12939a59fb1472eb1ec40e537530fca96349b86222c8130dd5ae9abc2ef8b825558d [...]
+T1 = 5cede2fbebd789d9c91d71aa31c35e36acb447993fcd890de826558fbe807e61f5c6700623ca83f8914ec41c600900dd6e8054133fa55eade621f4b835a71fc5fd3613edee48ecf2eb09bfeafcec923d53a31e2e7a728bb40afd61894d35eb6c88dc29c24ed132f5b3b4d7468da7c518ae765c65051ca940261868d844e0bc643154cce151d2a54fd2bf2f62254fa03bd93b202b3eaf88cb81ea893a43ae06f52d712b11f19f7201440d1cc2440d841909fdaf5584aca7ec20b9193e1a36c5596830e02252dd03b6beb334c78db396abcc59c0cda337cee3a159dc29a00f7d32c3c347cd9754517f5f179c584274dc8d9976200 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc840f3ffa9001b362d067bfda673695b15ccffdea904135addbe70eec6a98bd3166dfb3446ac1dcf86c6512f58b5b2ab23b396e012818b77efb3f7b5349337fcb6231f5e8c4479b87ebd1243e6748a08baf57ae906a2e49ed707b83fb5d3b9a492a5d84ea35418628a323ec9a3485872eb7af527f685d0864240757cb2679e6222dda965700535da99a320c61df99445308e6b86bf26fa27f1af6db62b5d312d90f6870de5a97ca7b99a240e5f0fa7d1c5f45 [...]
+Z = 30a59b17c320f57b59ccf87b5cd14a9ad920383b5e69f2234b88ab3a2f93e59a514af0e6f67398eb180fcdb5dec0f97cf8543de7833fb60ea63aa31b0974b6bbb902fa0976a07cbe21cd1c3401614604e17932afa7f369c63f1458f3958f4a8062bcf2b04cdf4780b77de8271cd5a46e2c891b1e6a015845e4382738019a90a03f3485fb0655cb662cd005d1d0eeb826ca279852efcd993f597e1d58d4fade4ad4fa41180f49a8c81d4fd92f3a7ee538779430d694b5b6c5e47478b2f64623af1f04a0d0baf8bbce88363e451e10efa7906f5a082c529aca9823a74146675b7140ce4e794971f5f330e66ff33e647e06a716264a [...]
+Z1 = 066c60c65e9d160dcac7c11b824da17aeb3b79f54065a75bab593a3acb09f1d0a0cba843b15f962958ac9ec2b79b416751d329ce65d5d485819f90d463a81dbaea813d52f1090f8d8671e0e628767286efb653c1749539bd395b93a4c3d8c291ab46b2fe15e181d4834e2abdc94696702990131c8e9cece2e95b8c0e54e2451d2df5511015d407122fe9c2419c84a8979c09add9b0b720af8128b3d59cef48a55f5403833836e7d2ae4f3f2f67fbd8f7d364ecd2efc85958b4eb39e385bbbc935bf18b095d3608fd934107555c7c26f1f4411cb9d7e4738c1e7bc732311bbe039fd824f32d65d2c712ac07741a0eaf1020153bb [...]
+T = 4a15c0390fdbff4a1f66f858d79e8ec6488352d40639a947806923cf82855d2021de7b6602c17a693067e8d09a0c3b6b840342753f90f3bc935f32c2b9c556f768779faad5aa270e36c98dc442296a7ffd2a96d67318ee663d942ec3a0ace151b176051b0636f513986148d08b3efc5d0a40e4c86955e398764e474af117689ac906f9656d3eb9d2a2f50b4ac45b815a6381202b78b1035915c487e592105e7f91690b3ee0dcb9746a04c9e07affc31e9ca8bd45c179f28b1b61e3ee3017ebddb46750956273e2b32fd3ad3aa26afff2a290ed3e61b52c179c03b12356257c229d9a59d1b4fae5f3a2e549700643a40cbb617f47 [...]
+V = 7595a4036ae12a6578ac2e88926cf411001bfdb54881804d1e08da352966e47e3f860d7e3cd95ae527bbb8b658649739189b06bbaf4bd160218ca4b75929f4da22cd59665616b3f341fae67e5d14d97987923ca3f68b875390ee5e85f3e4db5f8da9bd37a1fed024fce9ca5d261572d92d941e133f5e66858f547ab0669bda90aae1f154b6cb64748a704a28184f14331677051d8ad5bd85496caca8be2fc8a60bc721194802ef1a89ac1b9fab340867ca4260eb6dca191f7370be1cfb6de2aeac37926ffe6828f431cdbdab9c50b0503e92c27fccad435a014a4d13c58ba102673a5ee3d426e2929f23e3d38e5a3210d2ffced9 [...]
+W = 11f0499f0fb59dad598a2b6833edfc9fdbc869dcc084a478513238887ddb60c27409814c3a703c309be8fcb28bc335c372b78a5fc8c93170f5a079dcf8df861b9725e844b1b2084f7c58adefb1119948b3c81cdb86989a15546b00dabf1b42331032187a6fcd31dc3938e3bee9a5743b27aed7f5f602e3b7ce94b61c07e9e38e474f8ef8759b8c55565764e719748e257007564a83e2279cb7dc1dc3b25f4ae39f7bced22211bb9f13ca97398a34306c5d1f7ded3e7df9a778973e8ed176b2216051ab4a80d41d67bf8c60fd434c0a47e462a05648196a80298497955587fc4e0142a5c7b1e9f78acd9eee98f55d728b1998bf5d [...]
+
+TEST = 4,
+S = 6524b7e5e2c8be3120ba080787b0305fc5d57f0ed62bbd1633627cdb028c688ab21d5421080a21206a4e4a315b59519d13a6dc9ec4ff688c377d12ff1aa2e0a93c4270ff3628f669d421665223bdc988f55deb2742e5cfe08f26af76c7b852883ab3d8e39d1bb9c9d523ccae98d3449457f87216a2b8aeaebd5474b0634d7093262a9bf1d53d0133f7d997d6c8e91c02336bdc9757b5921ca4e41f84c1ff0ed868c4ff34c49cf0080b7f46af98f05fec8eeea94b143d9a97f9016c5453c8ea86b11c6c8294046bfc3381ec80b4993e2e20fa92ae8e5d7c7f2353a75e72b0bce8580fe0fc9a38239e65979e2bc13776c2e701acee [...]
+S1 = 00000000000000000000000000000000000000000000000000000000000000001ee2f7b2f529d628ece355d7d081d357e352d18914f4621ba26243ae49fd3dfecedd1712c649953dfabced6ff06d749d3b030b233a03be9e061186bcb214bc029bae8a32dcffc28381df48dbf8167efadf7fec23ce9681ecc7bcd0750b987432,
+S2 = 000000000000000000000000000000000000000000000000000000000000000060327ddf33531f335d565787fcc09497d5ccf64ab23b5159400ef4f68e1b577d817249699460bf668eca41316828f8b589addc518a355ff79e52fb63546861eae48f7a2865eac05ab790b05ff9868867880cac7099f369f3d6d7ac37d3eb9d68acf0089b0522a93d049c8d5e678c726954bc78e78162ec2c162f783341a66750d9e89fb01e4640746e613c852e9003940c19bfc34a86d91484042a8e7e67ab999208e8087d101f5707eaf1821d3a8b94140b655b951a141a4e77e484128792d51dd642b87d7f783817d7516bed9315ab85500ec [...]
+T1 = 4a9869dd87d306488f91f6f2287590303eb9d9442d6f7ae5fd7085700bc6ce4538a71c1e682ac5d53ee93e471bd0fc898985ae391d80d4fb283023cbbc823fc2d75009b86e5b7e55e1147e0a0da3441f1fda0a56ff7ea9ecb799ca23b2b1e73010b198b906b379def5d352112695b039fcc47dd530f6ad1db7ff6e4582a9e9ebc75893d778b4b70bae569026b773e8fa8fc7d4947d2d462553b3933d121ad7be1d9009a65011e75190fe98f21ffe8b0f36d9da3f57fc427e70d9b88216090f3ea82a2493affddb77f43586d52c773044bbeba4328bc582cab4fe7011936ff88c3dffbf1077d9c1ca778134a2f70121eb13f9f6c [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006743bcdfb7b2c543a212b219e34a5755fe2cd6e19a1c7a056e094d3f73f8b0b9f04c1aee53c8e63c88d7839c0d7bb016852ea1e799fb6bb82ec967d22444524aea993ea57a96a15851190eb9b32deeea25f6ddbc2ee151dd7b3d3e9dc203bc536525bfe78620ab41241d340fa8fa9d7c45a54dbe40c0a858b5c428e9346c66211fc4e3341754e62b446b6742cc8afc620c0399719e7170b3b5064ff95e963dc77ef76c11764e7a698bb757e88a298950a130d73 [...]
+Z = 0b716ca7b34755a1711884780e061f63d0d9820ca53251e8216dbe0f4ab0eb2ff03efc3326b9fd9428d88ed164b348ada97d80d8e83a114ff85982a16dfceb5eaa69c6fbfcc8f7c1a9ddd86a37f4c4f4bb0de4cf492326473752533efa1a121a266c597791be5f50f51d4634e17180574c22d9bc9811ee01e433b2e40e20e5d61a6817d03b4097ff1d7c09954950350d3c4ea0024def31b94e71dd117baba52d9f82c10003b2fee027d03e833ac1c82d09ca01310e04154e5f03f618da61aa4a94936d189b28b922ce81e9532f0ee87ba28d8f069588e07c2e4245367ceb8d161a59359b599a39df6376c0fb4bc917cc4cdc24dd [...]
+Z1 = 4942adb802be8754455293e973e6f8b561e721fad828054c7a4d0451f7bb5267487183a0284d4d34d41a8dba0cd2afe4c2fbdcc9fa1bdf381a137214abaf6265713e56f52e9d558e835269e19c41fe327f43621487ae3b8d1c5d7106d2eccd03a6ad9598e11db318ea5879a29d8bcfbe97eb66638604bc63e6c8c2e184ecd041fe429d4140758897a83516a726d0d1d62d7eff3f4fd0a128bf6668b21f675c05d21286733c8e668d0ac8edba39970df413f1b2544df7bae0638f3b9a042e34d35b3908a2e4012b2ebd95565abebd32dcde698ad630db018f673c15f3d96a568a0bb691a7cf95b6f522ff7abeedd2141adff1fb8 [...]
+T = 08902356ddd6819f5324b7e1e480a155362af2f3bfabc7a41466a878bb9d1ef3951ef8eb2bf09e3da759bc876a5b8480adc1b592bd3e417294b426d0d6a45680245980900c50edaba2e8c141555f9818b4dbe51debb36e8e922050030a0deec1ee8a57eff8fabf9fe96d428be223e43eddc3813d0ea44aea5ea0b5270dcc323732a8c231c9ce49cfc74fd3899dc9e7322d9bdc6fa66693bb40e0a6503cc3191387ef67919562184dc74d56132897807cb9fb1e8a7d4724da30ba43f55c449bdee6f50840f7b5378780ebed53c27224a0cdb1df665cf28ed091e6d48b4cf19a579348ae42f4fd33d7ed6246b8d00956b2221e51ee [...]
+V = 1f70670fc263ec8893283e8bce8fd74f171921d1e4af26837bb8be3aa9c45bbe7a780498b54e7402fca6e454b1fc2d6368685590a0bcf129b708549e8c3da9036868c9384a7c95c8e160034f8da877eec67d5b99aee2e614ce1f63f3cfbf728e62d28d0217392fc7124b62f5ba40ce8d2384f1c9f4ee8c755b26c95c77f8d7d5a1099ec8b7114b5762457b8564358f8d66a51181405b014819272f8874d008ca79bc2cdbe90e15b9c1fb11ae6f09eef3736fcb24de645ebd8ad179a90bfc61a4d6380430fc4da669733e2600b46af3d20964ad500c16a3d6c5ca2d6c8c63536ceca163da7b68f2edd51e96d3a4151a63939cf40a [...]
+W = 25aac115c8eb632904e48c4aea58fd9903a30b9d77462d01a3d42202bafdaf0cf5e8761aa46cf7bcfbd9076b2713c6b0dc0f34a1baebd80eb7efd60102d1b27b78dc9babe5be9693527a497932907292c4eb950d464678aeb3713df76624cd831ab4d81e0211137f34f882949de9f999defc24f0c23f0e56e26dbb6ce36c5304089834c5597625d017f2fc5952aa10507fde053d4d9e92a23b13f7e3ca8a432519b898bbd4e6a8be10ff9b0701f2d87b4d62a5b92c6c95564f446033d56ef50d5b92223b7cfe42dbee8ef27308190b0df9f0039538bbb2bf41daf65e7158e8d042eb7221777bea7869848986f84c1ac9c8b1833e [...]
+
+TEST = 5,
+S = 55c231bc83373fce5346bed49a1d6c629bbfab0c54cc20e8ffb9cc3a4421cc0ef99deff1cf40b68dc3e4002518961522f175b7a5af775914aa7cb27294107ff9a8a14a476210bb9c58278a5113cceee7c330498980712dd04cfa3099e4b4fbec18b314eb4ed1ba5d13b0a75d80b8db04a1ff4ddce6ee84ac83e1a58bf152de8d011eafef3a14ad83830042c05ae46717b5cd42b4fc37294c2a2f3b7f6e23e2c236acc454481e9010a709e1145dbc1833c7316426c7b433e1532c0c221b9da51f79f037b2863d5684be2fce179463c48a97ffd2c9580928026339403fcdc52fac0298f28bd6b3394837ca9d637755328fed0c4dc9 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000f60c092e270ac47065214ac78fb7c11fe893f9cb3723bb0e21a5f7001f025dc55769e3fee521bbedd3689a6bf73e895d1f503b4294ca9544585c8cec5a01aa6e7aef3ecaab606cec22c5d5b5eb2078440fce42a89f644a7094f10276e16c8193,
+S2 = 00000000000000000000000000000000000000000000000000000000000000001f6d86f314956ab6eb2bfd4412b4f0cafce0530c8f9f3aca5ed7e487f046bfeaab8a104a2c831f0580319259118a8c598507a132168bc042166a76e6a43d5aee5adb9eec2c31a77573429e713f688513cfd3b2c4d639f494af1c0c6f5407fc3d66d190e514541ea81ce243672147d3005136cdbb2709e262f2c4e3423e8755061e05204d450323d28d0c5c6cd30f067c6cdf6c6f9f28471d773343d576e9592cebfcc05409e562648151956c3c5cf1b456522290475dea8e6fbcc0bf33c65c313d6b7493dbcb2ac5ebfd4b80b5cdc018e71a7aa [...]
+T1 = 4bcc473ace58e1d0c6d777cea066c896c39898bd50b26c8adb26821f03d100486a4233466141b9607cf830f3e95308aef3f243448ebda2b2c1a941105d61bf6a0da360af09965ea788fd8740634552d35900081a05e5a3764579e26d0efd6bb1005a85414d92970c89876320e0bf0f57262bc2c4e0dcf6ccba7bde39f63a18d7e8e3e2e18dd1739bab73bd3551e47c655885a80fd7d0ec01c09644e545f085015063e1c87413ccded1ab5d3d5fe47674c967187341d26dbd983f10dfa65f20a32f1ace852661ab5fdc3b1a738801398dc7bc7ced0ee97dfa3612c84bb681f2b897fcb93fab79a17fa2d5dbc322ec4134dbe6fe5 [...]
+T2 = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d086ea787b7b5b50d1f9513ba2af13e19547e29ecf2e52b1af2c5cd5487d7344a9d03b91a56829d0fbed08bf222949cf2500e3000c2f4b2fbea083e19a4cffe75b12d69cd18ab44042079726b2618f1c36adf4523322252748a5fcd2858f16344c2c8018cce0ab2137ed47e2079fea4af998b1e06d687b89204bdeab587dbbacf2a3330ff6df0cacaad43c6f9ec53fd44f6b7f8462cf835eeea9a6102f9cf9c68b5874a270a4ae0547664c6d73b0617bdd7f8 [...]
+Z = 7e7aec4f281556f4a2422cbbc348c9662bce5b1858da6f44fe7c9c2ce885961fadbe479e84ea1e10fc12db89eb86c96476f8726f5ac7ec955b2a52842e2593be220bbab65e78cbad79a1cc0fa671a9cf5bd0536327fe7ad38243a1ea5032659a392b82acb75e330f0ba577f3b53e052bfd8a58a42b357ba71ca962ce64fcfa16f6673b6dbc04274d80d9b6476a90978b60cf380a8ee111fdc1c7892fd5ed184d88043c143a39454b85ce041eef31603aa5f5325bfebbd3c9ce841b80912553a0a1077b8e3cf745ea40c2f226c2160a23eb62f9c225019274c93ef5b5e2c049906b14e17032d045a4ff6eb526302eac0b6ef35a1a [...]
+Z1 = 7fbef2b9dea2a8cf40c45cd98cb075c832dea4dde6a3e767197499e220a8dda3645dcf37b353ceb03bee7f174606561b25c7e086af9ac7ea11301744e70c00de843042e6992fcae6e152d41345308af60b1aecc946544e56e507a868df869d72e5e254b6096f19ae32d228567c8363eff8065c20e801570a111af391314c779438537ae4beb168fdb299ec6e64b0566c30b8573426ee59f0643c2e8d763a38e2e776c3d7f7e75a9872b4e08367df5b6f4f1272e4d85e980d8e655936bbc43ab898c28abf8afba5ac3db94cde744e738f779cf0a03c3f60e736315a12b9b254a06d4ee9d9a0a7020faadc00d242199e8c0a8e547 [...]
+T = 7d1e46d1454ef927918f16de37af576a8e34c76ca1d7e57adab6cb69a8e394320c1efec6c20e21046088638d29460fad7e9a57745ae4c7a60212a403370cf51fe0e58eca758a449f2bb2972b09883539d85afa00a5d215d8de2af8a7c5dc4237ee8d42af570296e73bc04b633fad27495fa60759f57f39e21b78ad96045ade82ea56c21ba1f621fc9b1f1c6fda67527ab5ec3f9f2c8a6c4e12a33aea62efac2ab07b3822bb182cfe4a8fd0e2f467ae5876a9eb437a8c32294ea8cf70b99e5f70e45cb3da399f6c8e032ba5bc95f11c63fabc5554404b893c868e6b96ca1b38f85f9a4273032dfc12b58598a50363993e8ef2ba3c [...]
+V = 18db80a6b49a462e923e9cef3e9a4233a35ac8a92bbbf7bee81866c625dd79b9c367407317f0cfb29b1daf112df609e1141c3ec3e1084bbfea0f3e62d833f91d06debc51054c102cc5963c654d3746ba5874f9cd67164dd0d33ee3c38856c3b83e996d9609592ab3ba9fb777aab1809ac9873f778b10573f2fa0a86054a53f29e84aceec83258bd5652d7bb1175128da8f3cf99d815e27ef30549eb551255aff17c751cfb03c2273ac36a462d418f09113b0bbbf5d7c874ee107f1a6cbe8ad5bec5292d4ca684438d4bf0979f913a442d10a5ab4265ad3b9845365000b886f885894e76f2cb11a5bd6e43f23bbee69306196a30e [...]
+W = 43abfa017e1dd033dbc1923dfb6d6a8ba3d63e792af6a01f19893e8637c1b99c2fff8f3f1a82d98fa54f5c9e11d49f9ebcce383f6a415bb7214552998d48f5a9b91875c63fcc2d45a502176d749bac9e356f5a60ed787e9c2688bdbcb1aa7fb527aa2fbe404c2ee5fdd940c413df0f126e7b35e0f4d194d9a2a0c848091d5f8e7fd667da4e73211da6fb7d7d1ad441423f462e849614048b80dca40fd850f734946258a546d8145b121ac38f2960f6313f064c2337c700ec444b1581622ca4b1befb8dbfab7c2e1a92c06fe420cffbff46797493d34bd11b304de36cf57cedf8371f353f57aaf6b972468521d253b8f9d822039d [...]
+
+TEST = 6,
+S = 1b5729a6a063824b61e46851cda758b02e903833ae6e70e8490b5c5064a8b908ebf052d9953649c1159333514a1e39965f2cbddaa76c9b848be56e0cf15f71e8d11a59de8f1f0ba3384bbf64d49e4738a6de65224c800e60d8fae91337ec9f72cbccd6b9de973d99cf6a15e0c41c67f316189b94157f4468b48ab184f82e2ea95f6b9705f55726a3cef0b40b4b2a6bac8902076fd6fabeaa85963885eae1eab147ef44b5ac4bee43d0c77b18761bec36d34870e66335f7c1a88607e4ebfce048516ae974f04a0dfafb76cc2c991f5b2a4debc3f4a82ec524c5ae9f21b22e8c74dc3d995fb9071f123f62f3f69be065e9d5bc6157 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000728e55886d90d15807f56da6262c3d9b62c59eae1c8c3e4d8bfbbb4bb47a6d3eb1c9320d262abb7a7ddc5cd32b64bfc0adf38751ce2633aefa29c4715313535e32fdc25d1d937dc60247d65f56c82542a2a4e62c8c8749fef29f44a3a7efa0f9,
+S2 = 000000000000000000000000000000000000000000000000000000000000000045926495ac7f7e374aeaddfbba3609b29c764d68958778422e8f1a5afb51dad59ebc2e4b06d1ca9774030ed9bf45491c6bcd3c0d5ab134ad52f6675a0d80c15eaeae0493353aceff96390caeaffcb3d8b96159c379d2f729daf383613935783244f43795824be8d9de37a738a09c7b5fef3fccb5eefb96aef38c0bbe71ee56ddc704778be9d4c8ab1a7c2cc4e7d61c6a893b4e44249d23bd6ac3ca7a4cbf00bdc2d570c6eb5ee52fb512376072bb92979ad985ac0f710f236b96dd2a2ac049fc42213e187c909d5790a3584dea91ebae691c7a0 [...]
+T1 = 1f0eb9fc446b7255ffede8fa3fffbadc28a00e8a173888b31503c6ccb3314b43797d4dffde5a8e88c604ef8287b84ea1f10f602ac2c1ddff49063652b5219d79e44786c560db6bbe13f6cabb2957292aeaf47511247f23db831af0994e945e05cdb0961dcd1d615901aefb4da29329551b4bf4779230b25d6a5f23eba2026d84e3b801876fc049c3f71a2dcf812c21b48fd9d6b9be763330ad126d7a75340035af9a8881b26fea2a55138f25aa460cf1f1dec89cf119b1c342b9a905be0cb9540cd876f7871e64b2672baa570be69add9012c538dd4120e6ca4286e34ea49bab5dd6b153ac355885134ee96b7b1b2b563c2feb6 [...]
+T2 = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be36ed6b3b79503b307c72eafd322d0a437cb3ad51310267b37cc00e5722ed7886411e99da93f25f5ae01890a4022d0c7e58d6eaec7cd3bcdce9e6d2808337d4a54b8e80f0e21393e67cffe2ae1d88c7035884c4faa04df0ad59aab3a4b6df693f3d03a7d91ce8ef1eb8121f70b63b7404d745f89fadf5ad248c42d9eafb5bc9a8ac007f2f5ebbc042685fcb4afb4faec69a518f0aa9b120129c5b61709a8aa09aefbe66f4fc273088a8cd2fbf757fc8e61ddc9 [...]
+Z = 848e49424407cad172f707f4b66f49e2f262dbb5625718eb6c110cdedbcf9dbd9429a428f01cf6eb4ba7ee7a8c4d004257cdfcc22f7fd478cd27e7646d0d41b9a2354a6ce7eb3ef37db740ff56747d4b6ee96addcebfb7e4cb4f99f62410f7d762f939ff8ca3beb9bf549bcfbd965a8cadc3a5678195d4f0d996a3549437635479359ee2e4ed2ab84f36a1a831cab3e1ee63c565045a9e89ee2d9209201d7554649151a60662145119932a69252d7a48e54288008698b29a950fc0f9b065971ec72fdf30236bc6c0ec83f1d8ff08a70b1617291edc817e485c5a15ad3d198aa219f65bd14303cce2eb0741935a530745e5504b8f [...]
+Z1 = 2bc674821fc549b0ac14db00203098c1887e232aa557e9f7e09948840c0bbe2fd5e73afa60cc529a4e76641b2cbcb1ad5be48d7ba19a2dc954c2f08df74f88d67fad4097e295b28db2fd8579b65b5e28e2211f247250ed89118b80ec7850d9061d12e17ebfbcc2eaf8f27a5b08c09fd93f1fa77e46c7dc611d47dc969de0004d5b9aa69f3bfa1166d4f63bbcddd05d948cd2426115e8cdbd0e64afd790b69c1e6e116db2cd061c9a10282c112823e1e0a9e988d50281e584971a67c9e644a78d91938f6f09ccc53a7d258581197e651ffe2f41600e5b800ea26b07b20577e57668a42940c24d86abad3940c992e7ad660a4b257 [...]
+T = c5e26554bcbbb5070b12766e3ae2238a28cd8da26c9daa6b98a88c687b1d440337b8c05ef080c79abf62305ccf46f55496fa67e4351ccf80e099c7cb09e5bb33a946f4560f18e5286cf7d71fca250eb6d306f2ae4d4ba1513932eda027acd57fe5dcb5a2e073eadbaef3dd83d8d3eb2addba834830072b466479932db4a1e51f0fb0c442a07b4cb43899d9576ad84f04e2ba89afab35074b9c44d35ff4c2293dbec730bda2f29dd7b7676c68f6eebe25401a0d8f46f2f30c6e361cf2fd5b1a382cb590126959f40f7c747226535cbaa4390025bc285047908eeaa20fd27876dc13faf222da91b65afca3aa1142e58ad2f6bcbb6e [...]
+V = 2657148a120a7657c62eb0e33a294997d2db170e23270368094dd5b0225eb49e5e3b6da0a33bd45fc65a73fc1d3fae405e9b74daa7a9ee56568849abe838ffd65f5c84d7c8c76e23e377daefaf08b29cf416b4493b7ac24f238a1e7eacef46b5742ad83a36f51ad22cb5288fe969fe82abf1dbbfb8b1db6eb4a590a7ce566a753bbe2ed73d92ecd4a8fe7e91b283db99a840d999ebfc03f1a1ad906f84b487edaed64bd1873c7a5121c319d39da046e754cac80eb2f159204872a680d2adc4a445e06727fd0a3a40720810da03d88c0bebd3214ae631a9a688261aedbbda4d8d3b3b1f09292dc6e3694352afa336873c8984b8c7 [...]
+W = 0d6c30fdf059b5fbee417bcbe5c3f90645028b4101e51d9883b4796398ad0e9fdc718182968e8a5a99eb07e289065a4dd5eaa612c095fb5ddbead76135d0e034f916b4188918d7e7e66327a59edf2402cfebca0e73d16ee7c04feafe272ed7f7672d57b29365ccf7604fb23b5106e6a06797e9b641002e854be64d243fb2fc861d0ad6babfd69cbf66265eb03f844b252d982d4c912ab352d5f66401bf5efd70460218e36e972a55b4a8e8c90a304911ea1c7cd32fabb324c8909e77ff083aae8dea49da3c1ba92284a12aa0715be5ab4476249c615de09374e29e8a2d2bf2fc92cd51c166778e47844acffdbb6fa8fbbfcec9a8 [...]
+
+TEST = 7,
+S = 4edae479a206db64a0bdb8d2e303d4f83daed0504159ea4ab201237291b58e6c25decc6baaa2cd3710c35e513c8a67172ee966d4925044d3f089ac53fbe5a2b56d6035b17c9a37e5f1dfa48c1ee9ce27f03f251c51cfd18e6a01bb92798afde99231d37cfd3eeaae59669e093a4cb60b2b0d4bbc26cf580461b0cb7f93eb37cbdd4a83235e90c1d17bda7cb35459757c61af822cdcb87dd63f130a092c42e8497723b23db7437ec0c6a7b0f70e2dfe3aaef035f33bd1e1a47fd876ce737cddd28fdb3a15ac66aa3f883fb73c03e0386664bb1996c7f54c60cd93f09b18a4e50c445337484b05158a8b5d0052296710b906b9dd7e [...]
+S1 = 00000000000000000000000000000000000000000000000000000000000000002050dbc4af8b6e74c2668958d68b828869f92369281a6da87f2406f32c1e2e3a45598a7566530cd7f4a0aca1be8bafadd5366696c5e9b9e33dbf974b70ba25b88a8aa2becce5a1e393e1f977804ebb726a968ccd29444e7a685c26d5df55ec6c,
+S2 = 000000000000000000000000000000000000000000000000000000000000000096a9b793f2b0e3ccc28045d4ab3c8fa10bab19a68228ae7ce843256082f81379c6cd014d637a34fb131b4d7d2899c09a9a664d80fe78af96a74aa920bdde0dc40f04f632826123bb25796d55969924391bac493be6a81c6ed23949c1d707660d7c70bebbe3564cc51432b8dde0cec4c1867431a0e835ceee2649c15f22ec917c6e36c2ecddc3bd6fec61d7c4bc4ccff2c9c00f8f3af477688885cdba4ad8cbd4b5190b6215409b5f7bf14098425c8ea6752b158b2a448339daf6562cb7a54e4c8b3131b152ca2bcea4b4d84ffdad723cb1b991b [...]
+T1 = 1818f951dffa2bfe7db7ff15b7d7d4ee3ca6401ee81deadef4896e27bf27b3db42c5d8c89ef6e68a4a07046a0518c41840d97ba1912fa9ca6ac277dfac25084849e0a46fa95bd5f907b20bc9153fcba6217f7bc8824111b54098a337661c45eca214fa7800e837080f9effc1572e1eb2d7221d483121a5466171591c44e6b4566465cd97c09f0eb70b9fdff3ebbd967682df4b760a86d102969def7bc0348f2b9840d69cd751e7e43d2e62b9bd65f511cd008db7168e7d586cfeb4e12de8aab68bbc8d133a83973ab22e37174f11e4d7cb0ae4fc6a3c933e896fab598a68f22f31b24bf11d5eec43d8933010e8a0131400c68ea [...]
+T2 = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b569577be1a0fcdd19086182bd3b0a1db4f0a13febf76a2953e74ea0a10a26d535cadcd71b7b0aad7f5d92ef4d4d6e74657be4793af1ac29a198cb52e396461f69ee3cd973446ba38f37fb71b815f6f4ed9eb02992a2ae608d8da95e5f7af603652b487d2e72b36c239f0773bdfa46475d5156f693011c8cdee2fe5cba2e3645b55251202a8511551b63a6bbc19bae8f19ba47038e92b7cc4650c9e5b72baa4f21663928f012945f099aaa0f7c8f9162a5e28 [...]
+Z = 581465eca378888ea2641acbeffc6718c0d1ad9f34c7f3bcbccc7b40832972b058afc898b343d21282701b2d5df058293372a6616e5aa3902d77c49b7a81710f278e68acd662c994e86572456c9410afe425c3fe3ce48530d532085237333ffeb1db693ae2b98ed73f98643cdf81cb5ec0079291f32d90f6ae075862e23afb47424ca1cdc274bbe0ce6e3a87d547207dc7cb95f8f504e7ffaf3bbe08c9fd981ba2b2d4e332f4660fd459b20e9ce267c5040aa3c06d9efcf3df3e5fc375e90bf18448a010de9d58eec9c392632fa9dc2c32e673e5e03aa0d65caa706bef9c1e9a7295ed32f62f2a27f397df9fc6f3388f48497aac [...]
+Z1 = 50c21df59f661e4b85e17b3fd9f89ba5896ca74ad9497d6445352be18cd7571134859e3de64792583c68d1799ad498cfff4d63b3af3ea8b77e92d05d46164fc6d82ed48a638e2d0a1dd4cca00fd19b723712f7f9ac196f8f4bb4e1bc51f0bf2c4635f28bde687057a0bebef992e1b49dad396b863aca96d7fd74857e509e3dfdcf8c231cd79a66f42be99952b3cfa729343a7c1fb6b9459617deed649a5c290f51433cc2f347055a3a4fd53b48ccc2558d749ad8429d0ed2d8934cd3562f9f0abef68c69459d77132b6e1e8214b909f1540b74dc8ad375698df4f2130cfb81f2f6010dfb4277824b4dc332af751cc53915d0ee6 [...]
+T = 6480e62afb2b5f01455992f589dca4ef487fa7377c46ad396963a7c70cc54176bb6f3f4ce68f7f031f1229bd109cb45615233acdab85f6c8c848449561b601b5d377dfb67bda21abd4c4bf045b6b25341a80ae50178c89189a3496d43a49fb2b1d267179387590d8343e57cddd721a4c32e67b2ba19bbfd83e6e640a87d93740c3ccbd217acd9a379c21685815e90e26b2391e93968021c6351f85690a9f2ec934b144c1f84e12c2ac97f3f1c148e2168aa69426640b366d3eb8065730e1de4a322c4f53c1d5e26734d090c6b41cf0c4f743f4baaa0436b4010323475d06945fcb3ed7162fbb352dd8817a37625b970d4de60ca6 [...]
+V = 5815c08d8b052e28b0313b5c7e010d672336722095a4347e134086698d98bfede9dd90196345cd9a3abf0352fe35c3d880eb86cf3924b5bbbf0a30a5aeef5157a7a228bf069c2e3b99ce09a7b61b09d258a3813bb65f53dd7453d0ce84a3964cb06619fcfdb1cc8d15d8d8e06fad954d1e53262ef5b8461d32eba5e717e7d8b4fc066b4b41186d6eaf6a1054470dacb00319017c67f3466fa9862d0488d7ec02edb5f9a3d275f6414ba671688fc9db8aa5fe612a858a9209a7d175e74e875c32ebfeae1109ff9a639a48a84c26345ed9db2b619bda3a1f836678582091df46f4c2a763266f66bb0f57ba90e0c7631becbced05be [...]
+W = a09a34a259925134cc3ce426a20984ede9d47de06ee114e781d087534d4cd32ca6c32947afca833f71d96dc57ed09d138b0e724979d843a8a818817ac98e88626891a32351db6511ae5e8322b0b5a6b9ea07efe686f284617419cd1370b48cde9a8fc75c8eeaa897d479e1753bd617abdf7c0480f95747743526fb342232215b84f681d335f7af85376d5a955bfa5d53d7a201feee3f99bbd323a15bb246765f03b571333c8dd028b5c21810a72b81e48cd2a62ec47e4ecaaf6415e95e0ee093f6b1f5da647efe6232d57e6a27ca8e33ecf81fa310afda254f75f29efb00c20eba247fc37ddab2e441a081e42bed427fb71ff209 [...]
+
+TEST = 8,
+S = 73e91deb57933d2ff28ff4dde0494e404004a4fc87352ae73e01468e7e0220b040cd475658c61b00a3be7a575b612e4defa27c96e80ae6275e3195c8dfcb71ff61a3f76f0618e6e2d81fb33d30349ff166b141d04d2c8719feae21135e9a947d453692f140b96eb7106b5bba07fc7536c8163188d4c95f03e9da230a470206a53d93f5b1f5f263d3a30142875029aad9b05dea43fbcb007211fd1dfba317664ec4dd3306642be8f66042a2dbcd2c29e615f0b7fa9e673c73425bb9d0f9fff4372a42eecbdd3102e5f529aa6a2a18d262879aefe7040f745967db63d80a89b7935ac81f97113780050cab545783dfefc93d6f9258 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000420d076b503e2fe6e38b163814d74b50841b879d8badf090d47fe9757bf097303fefc9c6cc9cfaa5d32ef6cb92eeb84324afd80f787c11de71908d5f235a81dc92866e75a9609ef4a59818b39359308ad5010b8fae168df7f2216829fea6a951,
+S2 = 0000000000000000000000000000000000000000000000000000000000000000398b8302346b6e89b87c8a21559dd4cf3b33534132a025d5c66fd501e575fc1f59a3ab071396515e4ab01e4fbb6fed6ac90affa92289ecca8702565bcb1ea9a5d33370c991e8f340b58c5c5bad2eb0b3c72e8795dd226f8f7b06888c26ea4a67f60177809920440468b3f0139f4a23960c38fa233b8960202bc062e30da74259c218c57c72eb17fcd053a41eb05b47d628fa240d83730a09680aa3655104a48fd9a1259c2706beadc344b179ecd612e5409d0f9c0db1f4c0dd59299e5b5f81df1b4a71b353ee6c17d024009f52b0885949e213c [...]
+T1 = 2c5ad4c7fd5d44d2c2dcc926fcc800a05d54b20e77a608f268a9dd370805b30697c73ab1951a3aaf8d74cdacff50a7fbff45af9cf364ed8eb3521f0eee80cadd748d0deb4c3ad25ef7cb231b0f4e8894e0aa1705de1e41c4e5cf0a8f985718e8a5d0b66a7fb07d652d9093271dfb97350a1d0385017af40bcfaf550dcc99085a579fd17786e1dcc48223e14b18d17d81073177e9013426f5a9878f358cbcfaca2c310bdedbc675878f5085d66de043276a1510178420d4ef24b2666eaee0f9cf9990f908e3b84d43fb0cbf8959ab4071670e6e01338d15be8c3872b169e65dde90fd5388bd7996d2d5ae369b41b305d82316843 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002453ff028ff64056f73d7de2243093c1d8f5da82a681d4b068df00e57d6c2bc3443a904eca158beb989ae60a3ba7774b963cc35afd6168fd4bb5137b1acd3769a383db66ee13a9dd38df1b04ed60755b6a542af695018313e03d13debe911deed416bf399de5428c37c1d1d2dc895ed39eb0d7998a01be7a8d1e33a836e836127c8c44bd9b8fe2cbf4a9578efc3a6574f3ece60020c23956e87fe9dea9b0b713403b4e9491715471e9cabd86cb47458b3684c2d [...]
+Z = 639aa60a59d1511d4ce3d2e3915714e3fb6b11ba3a4b7fe2c342ac6af69e36f7a28805163627738ae9934fd69466b9d3246447516e8ff9e2f4e0c2b3704f1250eb19dc582758c220c3d783c832c44b94508bd7f0a2de9783c3b0ea1a00345a1d2919ced63b0fc6bff23398d49ae8d39840c5efaa0931c2195f88a1a7a648dfaa871c887c14b0c8f6b8246dd4394a6a8f62d2c027f36b6c22f175f7f5f5012318c6c6449f78d1d7e3fee3acbd83047ee98c8061b142242baf7f1150d01628ca32d296ab7dc31899b809a492ede862159bbfcecb20f26f6296eb8c19edac180f5595930f09bfe1c91f6c496843be80c6e25da239ea [...]
+Z1 = 4d93f8e5050ad52168c8bf7178504b85ca00a9235d9e31b6a657cf69f72b59ff4a1f3b6e965507ebcbfb80a3113ff6bed4cb8ef73771d2948bd5bd5663833c48ff34a2129ce543f06e8cbeb08eb1c84cbe3bb16270eac03c59f8acf8b1dcea0fc99cb2bbbbf9212b21a8f5c333f444dd77a02a0113dbde2d948c03bf50b9062474e517124869f47d8aeac362bd7568d40bb8de0e1480f51d1bd0410994c3ccbe511b6a6c54398a0551728b9b5a961e560de85c315ddf24ad493deb1ef8dd844dd827e606ecd17e2c955aa0c9c2a2c29a3fa78789c9c0a211dceece8f700f55f86463683fb4c3e11eefe7e9b03273a27ea0b9e92 [...]
+T = 57a6721c86b1dc416a7c89d9c47c281689941efcfa6d99b663287696346400bec083d01ba33c655c804dae1581bb857f033d8ac86bea601b1e04f5e9b6aef6e7cbd3ca9db7a13727443a6666349e142c4c88d10c7081c2ca4ff62d0d5cc59a5a534588fb871ccc5929e7c4d15250baf17e2d4682b470be70f272a868a06e275b9974723c4682e11ad9bc8eaf9c48203fdce0d61a49fe2dd44cd3b336fc29b27b49b970e6dd3ff8ce9a6a27f35e996522eee4339e90f55bb24996b07250935a453c77d5f5330d9f5da08ce99eef43497169583f3e342d15e8a54c1c303a75381700832f6985ab78313f305e8031dbc197d63aa4fa [...]
+V = 5d4d324437dbf8f8767f793223c29713f4ecbd27c839dcbb7f67c9fd11a921ceb7377f059d21a9e31c918838e88cbc14c335b0c917f254823dbe109b7cbcb747d99906945afbd737711fa159160956fd43bb53331cf57d6649ef8a6a8b9f653b3905bde5a827bb2fbdaccd2ba432e034b186d58569f111e3356d518de5d374933b56a0656b4cc78c8e868215981f7542e44a900ed50619eedb70acc195d7897cb373467f8e2c47ec0e50e63ee3b03bc89cc8cc0a87672f0f94a5cf4e4f2abd08e536efcfaef4f9296370e5fc3d8496bf215fda482ad681afe77cc685fc79aba17c61f2c0cf9dd56d834c9fbf8ac042445eb032f0 [...]
+W = 84296ef08de09221c33693c255d06e2ebbf4cdfcf5b22f3a0e2a503447002133bc15de4a8389b53398a8048c8a19baaca5c4ef1498d36d79f2d32ad11bdcc665442acf798e23bad9c7806d3a4fe9d696382c1c8658498166b4b477308dca95b207d7763b5492212169f9f71be7ef81c91fc9d737f586320370b9cd43058d49d748621d4507ec15fb00d7dd9a2616e3dcf1110a4e4feb08350faf29f6624e2e8bb18c93ee5a6fa5199f07292bcab5c05de39bdbf05a09385ed1a89480cd933b7c406e3c4926c6398377954db85ea520e2b8e9e3475162ba65c9623deec85bca08fae7d625bed1d581dea912d9dd9523633af35f7c [...]
+
+TEST = 9,
+S = acfd471ca060a060acda7b24cc1cd9965c60678d3919d29b855e71e805e0708804ff360b21765819966d2d6932b5955b0b2f086c0c77acecaf1b498cede49d4dc493b1feccb913036f09fcb2d14d5f5de9f2f6d5b02ef27704320809680f10efd19fb45b69c8cdfbdeda0f6f54b5e67424e5e538ea6c22763dc88a007339d650b0de1b8dbf0831ba58d3b5cf8290e40af198ae96bb0814e5893463d535cfc452984db399a8f3220f7599e63092045c172fae1b37cb98bc25b42c413849058e5688c8c01959e3dbade3c2c419193b904188046d10950052e4c086ea998fd43d6690c93fc45867058d0ed8797a68053e539cc5805c [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000247520ae5f23b8d87c9d4a45a80c1806607cec2d14189fcc3c3ad626d8faed4b80b38cf167836e865ecb72d6e903d7144a2d70b2c5bc3513a7ddfabd42bc588c6f3adb5b540e7ed33298f48d20ba62a740c519a8db90826b18da51d300df1426,
+S2 = 0000000000000000000000000000000000000000000000000000000000000000ad2c6dd7c644e9b55d72d356bc90e3876f6bba33e7d687a321ac547f5bce586592e55795e10c9b5216aa0348d384d07916208548b09238a35b749a6081460774d804103e354399b1d24f7e4320c28573ba1e7d88575db5abdb250fd1278bc425b73917aa5ce7e7f4c63abdcc1d699cbc606ba72a393574bd86732a8993fd67c90f436294f047b592dd152c84b6c10b6c14fa78beaec36e9d7e877b4e85756d3417a941330115ec1bc1549b00e3b39c9904ea6202f48cbed82c2248ab4088feee7995af03dc375819c8f5dd9645622fef615d4d8 [...]
+T1 = af271b0f25d7783ff0af424267dee2617c3071c8ca74a97dc89691178e7618de5031ffeb666fa0db7cfdc8a5a159c33ee802791d14a7c51eca5ca38522e4b389dcbb3e6fc53feaf9693019a14248ae08781a50835cf7887bd6d19f018a7f497bd5c5ecc69381f38bd976249d8abe15290297d82ff8eeec5c44bc3b4c1180749968bfc5f49346fc0729ca08141e7a5d5cb89498a38801a8de71431fdc9fcb3fcac17ed1406cfca5f875e5fcaf5afa457dd67a428e9936b62744906c72b6fe7c078f695a6f79ebf4155dfc29c7df61dfbe26867feff57789403eb4e996561060e3672d1d56d82d8b796a4c679c00f44ef5f782a15 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d62f5f9ab9175333b430edaaedfcecef0f63685ffe9226d8e77bca1e6aa18cdc134f86a2c94f91b28b8dd6006489d1e7a11ba83fad5a5a47b36c0e7520d0106900a325c579409440c7e4b9b70b71f18edd90c955e9ccb418dad704d5f08bf1197f80f46aa3a8ea5f30198ef75e42a4ba7a370800d1b2ed5dd45f8eb4c11c6088537bd19e7c32e3d9ec54b84b9d7214be5330fecb46e5fe542386234af4adb2e03c92f23579a3a21f87cabfb0edbcc93f697478 [...]
+Z = 1965056a098e75dd190abc3def1fcc070e7d9dc7f38688510f5f6924cf0959567a03519a33358e9e653d6f270e48d21539bfb609604df55f5ad215599b44e67915322c8e437b348ac2cd7e2b89826d45114dda26616514e152ee7207442a0ce5e2e6ba2fbaf58a059ca8a30d65f7b3c045ea608672b7b380433c24ff40e1ac1058bd66398cd3059e3a20a952527f2f7402ce8351a0c8c3cf164630358aac5ec4fc0a81a8aa1dd7059a5c9ff2e261871ca3cc8b2570c13356f09220ad70cf26919cab4f44890b8232f7857685233ff1583c02b45b182d76a270776d44ca0e73437d8bc8df3bfd2f7af8ff8075d7f21e0784e59297 [...]
+Z1 = 538798e96dbab089bcca85c2288cdf1b2ef4ca677b5de1c8571bdc37549e8a53eadfb388bf493164a8ba2d0e428bf82244391aa191fadbdb22c53a9372ddeefa3fe02151b54a1118e80ef6871719022efce873cd29ef047e71d8fdc6345cf2bb2dc344a1b6d2b9cf4fa21af0436c0329e06c092dbb657b842d4ddbf2b321d18bdb5ab03c517ac3bdfb5ffa26f0bcc173c6c9d5d096429a119b319008c6392580afdd496a8f40134cb449c538b7a67e94e046f097e1a5d7d10f737b3410bca5f7a560e2120e2996445940538d1f7aee439a8b3442bae03acf2c429f3808c6f033316b49896f51f7505a7e87a27c4465db75dd9a7 [...]
+T = 66600d85eeffdf92b46e0e74b3d376c160b05acc688227f11f5285ae8bd1d016c3a2ef01b2427b2303ab6b0676bd34bab0bbf3a79a82cb6308e630d7eff6b5f8b110ad33e5a2a86e08058bfa9d2ea07a3a8f83c3c2641b10c3024c78c9f71728d84e5cc2ba2681f7a46f6fbcbc614c3123fcab4ecae9cc9a96c242e10ece4fd17bbf3e297014003a3e0e1ff52a3eddb7f07703b22010f0ff39740034ac1ca090b044ff15b46ada1920142a070704897a01383453d2d3a8fbb77c763a3ad2c314bf58e77aee1b308dc5cd18ec0ba7c27da013db3ea867abb9ab7298f12fae85bdd2b01f6788d965b5f7297b9c36a45aa37d58ce99 [...]
+V = 73be2e13f6d993820c87a93c79a45a5fccf9ecb61248810637789f08fde49b05979647b96b998dc79bcfa66f4d6a4ff074f2c5361b228511a4c6e90518fe0bea2759493cfd9e2d3f033bce4a3adb3ce5ecb5e6ddadb35b237b8e97568a31c2c725598201f680305ed3953ad78541f00dd55c0aa9ee1dced28b5cac8e2c8ac9d36e87c8c3c793ad7e6986e7e79c6695e1d76e10057039a9719d3b215788c0442530ff3744812a2eceb54944783be8bb586094569b0d26a77df59c6b588062022a6c21e60936b239c4564960dddf3e5f9723cbffd26fb15050cbfe250a2809cebfd6690e089debc155ec12dc64147aba4e81b99e44 [...]
+W = a6ffd46910f64358109f7703b12e14f323345156df5d51827f58650d2aada1ab7acbb64736b1c18606f794a60f706bc776b142f16aab47c17f45fc232733170c4b4a9ce37d3030096441246a1a44b2361ef9acafd21b5242cdfebae8e4da810e17483bb7e9fc7d6d653093c5c021338b9f0b176ebe008b93f019516ebcb9ae124fef356c152c2b39b7a696370dc179484fb6efcb1fa62020d7bd81e7da4dd457caf96ea958cbce70b0c464e5becbaf0efb5e01d87a2b2a78d4f382bdb054b5deab5c18c584fa6c62bd1f14e5dd4aa27bdce57cb0035e9c2a8aa7655358de0fbd9814abcc48a283fb60d525c6798cc3354eaa40ab [...]
+
diff --git a/testVectors/bit_commitment/muladd_prove.json b/testVectors/bit_commitment/muladd_prove.json
new file mode 100644
index 0000000..9da60ed
--- /dev/null
+++ b/testVectors/bit_commitment/muladd_prove.json
@@ -0,0 +1,202 @@
+[
+  {
+    "TEST": 0,
+    "X": "801f4dea68b9ba54d54ea37eb3f8d7bf879faac2bbd49056c814555543b1c44b",
+    "Y": "f307848f2ec6727d602e78c12dc9a48b6a8aef05d343fa8cca2efd20c8ea26e9",
+    "R": "318ddbf164addeb9a7769b75442f32737156f377a77409e7afed770ce57be8865c3723a9c71d65df451f8a9e468e8d74b012d745104a22c872e073bc5eee41fc8c0d7c80a8800734d15c518d396fdafafc72daccd3de1ac99291730ec736af67c2c314a3638f610f4d96457d89040e00670d4282218dfd3b60fa48474de0d16fa1fc1ebca49206b9beef71b3234bd29038c2dbe2c464adc40dcd171e9e1f1b5e2fcbfb65e558e3b96e5684935103dffa0a79cabfbf7034e712202ef83435565dae742a0caa84533c8495593dec7966a7fb6d6eaae6e0637e36b65975539cbf51538ef8c853e2187829a346d88a0c93f950 [...]
+    "E": "cf2605e685b3ad55c2791c55e43ed26ecefe438c4475f53ea8a059610b0de15f",
+    "ALPHA": "00000000000000000000000000000000000000000000000000000000000000004c877071e8b11903d6d99fa3c2b6e2f2283ec9fa8e728e45e0385f678626f28e0e3745037ce4af054385070d524a435bb8f5c710f70baf04bcc021c699937d9f324af45a81ea3fde62cad060bab45cc7578dddcef96948e1295578e9ae264557",
+    "BETA": "8c8089d33df10763fdef52bb5fdf58ebac57e25cdae7125fa00ebfa0794649ddfd02a0ba96aafd7fc864718ba163bee9b09e18bdccaf7911551ccc9a3c00b4ccb0d3de927d5b7a9ee3db779c46aa1ed7806a12fd8daa817f3c0926354a5b90e5e6bf2a153ae2010711cc69929af80bd13ec529ee1ec56103de5560aea3c1329eeb69fa1c83cfd4018dbb4d23057f4850f9e72d5775dcae88533d8ad15141a49196d0b3b60c8e0e845bc1ec51d9ffe37fcd50804ce1f30c2d14f2e77604f3c4dc21ed022172b4552207d95db5c60b65208ea376efd887818564a01f3277d1b89a00df6e26ea20688843fc393406d331b [...]
+    "GAMMA": "87fb0885a31f9141df1f08679619098f36673beea3833b2e32c46772b124892538fa3e04cf1a161d783a0d99a8053a9d4335ef9ca1bf9150e670d370aa8e9100753c7ef75ec62911ba3536a472a1d36a086ccd84c2b95bc7ea2994c69b83f32130a6e70e994a5b58198f3facf1fbf9a57672720da38fde474ecf69a5a31166ac60c94072b3deb3a95f1fd41efcf92f0e05b3d77775df3e0473a00003d142cff18e3a30fa586d45de22c1de3044aa223b203d39b649f816c57142a525329da3a5c0235fdf472f5c585249d211e0eb7f83fe99c57f130319a337a1381ce6b89161649d5799f4459fb2c041f6ade80c67 [...]
+    "RHO": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ef74133b66df5fa21d7affef86083c2ac0b0e9ad57d4445f417ab5c56747979aa5e824a80f0fb89579732c4056f0404a2c0d8e1f9c6b331a7541151921f5c5c900121709d5879959537cf55e32d3ea88149b2ab722b015911c387e0414b4bec8066411bea101c895b1209b63df9276e5e931db79a330e40566c829b3f4ef547c630cc3724d04a9319ce810d64c8f22 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000002b847674548d1361e2f69d4ef1332491a5f095a56da0dae0dc0e111c63a8779d877318fb7056734e9fd49d4f12b2b741c636640c16cb3101ce156096fc485c5488876df293056b6251ec9cf3878379a2cd940dac866ceb456b6b52d6f74cc14585330420a01669b10ab1ecbe81f216640967b833c142faf65ec2a14997604c3b3a99ca407a5d215fe4a39bc7a32c7529a24962fbebf5dc0710a126e56d53f10447dbbb93a992a87cb1196ca6758087a7f74aec96b35aa654df61661b141d8574b437813b6292a36e97d70fc1feaf153 [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0e61d9b8bb4dc782bb142768802daf28fea7e10b40724e7a42ff0c99c3ff1b6f6f8a13bad858774a823734d322fdf561a64d655e589e259201d3af59a68d03a4f210f766e204dcbaec2c748bdd77d550f5b450b4696316432983f12f2238452ef89e9a2ee8cf5ef868068f10555ae4365663534ceae79295bb30243609bce2bf5ad521cae8fd060bd79417bfa9aa [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e40a132599ddd90cefa01b80bc0509505e8b56d5f3a3c9bf93e52665f506f0c79ba38897d6f81d9e2c76621a7b7f2106ecd1d955b458dcc4f30e06d05bf921637dc7734b6b287a5d72ef3bc687198d254ddd532c72349bd2d3ce6e06b4a09d7e70a95ffc07536f936b987edc2dc817cc19f93b67545959111a97f14d7f92533d7880adcfcbe52da9b6e7bcaf5cfcca [...]
+    "N": "b093df5f2c15cab5f6f7ff96d10de609c6eef7096db944569ae0e76ac11f773157653b88a91247d84195438b9ff4a84c91097dcbc39162e8db9f8e820e758c361d2c7a48d57401cd85a85e9806659eda81a5249eb2b498915470f23e40b87a2125de0aae4bba4d5ab111dc942fbd9f4ee1a3a0cef44863b2b1686305c442c4f935e8458c52de9e9d3709e33678ffd45777095b5e8e81d65aadc2d3087719176739bdba3972c23b1a38650d15313959f18f66f0a1e4c0359420c1200f90091bce3451c6f8f6dc94e748238ebefb132b6f4981c1605ab4b18a4db84249530a9a78472cbd4938d0544eaa9c1c3e958e027aff [...]
+    "S": "9a7865c5aad3877e8934f08b7569182b803f0ddc9f70a30fc9e7e8be6431edc4927bcfd3d4a5b97e96fa4592ed415282bc479d91983d0cbca2d05979098dee39706be0f05b17b1d57e085ad91e1d8255de3d11f00092a3d409e7f222cd7914aeb35d95eb65a0893bf388c23600dab09f476b498a25b533a5cf6377bcd908bfae7a87934375a8e773c3b82354ece2cdb2f23074eaa74cfe527a61ed6aa800eaa2450e410b3aebeb5379adc125fd3b0640f8871d291884d89221b6ebd52ce225fa84eba0813dfcc1f982330c2d7c73618ad59c4398758ecf71bf54967ac302b2b2980d3b58cce99502bd8e1e5e487607ec31 [...]
+    "S1": "00000000000000000000000000000000000000000000000000000000000000004c877071e8b11903d6d99fa3c2b6e2f2283ec9fa8e728e45e0385f678626f28e75e39c9d93ee2d0592c8ac9abd7ed4e881532c091a7c5206a66b0447a69616dd8ceb5b13436fa97c4092d2140894b7867ea7b723e26e6a8fa1979aee3b73082c",
+    "S2": "00000000000000000000000000000000000000000000000000000000000000002b847674548d1361e2f69d4ef1332491a5f095a56da0dae0dc0e111c63a8779daf0bfc82f62edc80da54334baa6491a20e7a91cf0b93cb161c594404f7cc7a2b3e9316de3683cf843d13a8991ad09114767389d3a6c2df280dac81d3c1e4e244d8c461f1f16abfd27c15fc7084a30e897a64e72545ecd8d580cece0c39a7bae5508f81e15c8ffb81195e783e133fee397458d0a278f7634b42406dc6b39fd94cf29cb83b395c745de46f5cf819b95ed4f5892dfd2b787eda06c8a5670d087a10fc3679378c5b680567504f6202d583fae [...]
+    "T1": "87fb0885a31f9141df1f08679619098f36673beea3833b2e32c46772b124892538fa3e04cf1a161d783a0d99a8053a9d4335ef9ca1bf9150e670d370aa8e9100753c7ef75ec62911ba3536a472a1d36a086ccd84c2b95bc7ea2994c69b83f32130a6e70e994a5b58198f3facf1fbf9a57672720da38fde474ecf69a5a31166ac60c94072b3deb3a95f1fd41efcf92f0e05b3d77775df3e0473a00003d142cff18e3a30fa586d45de22c1de3044aa223b203d39b649f816c57142a525329da3a684ca8cc6b888239c2a503c6dad6c3eacb61738174989410e878e9b697c9b2821d819401b1ef6db3e7a3bc08b3a958ec84 [...]
+    "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002475524b6d0e224fd775c44ed88ab5eae2fc2ea480267c0e911cc45678e91f6673c63c402b0397994ba6133d7dc65c3df239a83f990debf619e14239da3652dabd9bb9936fa272939da86cb3643341b69222ea3a1797591a8c08aaf20ca2e0301dbd87bdd8a956507c0e5b54f080613dd612559ff1ae5bc49db63787a9e0f0d19bb1b61a6c1e20ba705735715a9d099bfddfedc5f53db9332422a75e312b143145b4b6d484dab3f9edf210eb65bd4a2e7 [...]
+  },
+  {
+    "TEST": 1,
+    "X": "00c8ffa313b7a42c28a9aa23511300915c09de5b1d7c94034b8f222db54bcbd1",
+    "Y": "aa78bee1654cf32df233ed4a2cf6e41481f4683a852d73370519c6aca2bac9aa",
+    "R": "46c47ad73bafe437ffe0b1261f5b261430389eff49aaf326c41ef565d5153cf253c530d166281c3508d094447db1a1b88a6d3b6df46765a9584bbb65cecef592581ceeab50db56326eaa01a6a7a6970cdbfa373114e6c54a43e8d9bb01ffce42fa9849ff2bae9447ecd8941aec4ef096e3302b0e3c6f61c2058fa83e63423115125828207ae2fd56cb168195f0f77a00f5a8a4a26699ea733a3f76801e773dd54b362a0a8fd1b12dad39e660c4d23f9f83dcb2f4b17fe6e8af1d65c2eda5c42963bb8a31c90a26ca77819e52284f91c6cd56558a4ca574cc5f6c9c6fd3897b4f39b0fddb96d1dd32bc1fd2b8a84c80b28d [...]
+    "E": "a1bf317afeb08a155a51c60ce9bd085370d835e107c30a4964bdd4011f908071",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000b808313d49f13b55661a3198a6ce355762e06af033b5d5ee83a43d7a01e15eca89d6e2409aef39813bc0db6564a1bf871e45d769df93dcf3288e7e30ca0690945e08ed234ae8e6752bcfab43d02a924655be08b4ffcfc657a1d3f850628d9d2d",
+    "BETA": "89479133b939c970179a6c493e359b665fbd9c3234ca1c362550f785f6cc868471e7069c6e941069d06b6eca24d458babf911a555d6e49ee3f2bca488cf18a08ffa54d048a2663c55a60a5ab339940090b29e7ee0183b89a93eafc006abe532e6e11c5072d1459776134e4d969fe547db189f762c5960362f6d5aaa99aeb38110922a75fc53827495b1cc3a8254226ac290ac6f68e745f9a37b1037976ff6cdbb4bc06289d0e23c45b0ae0baa5de61633dc4817c087ea7910d71fd45413e1fa933a8fd0411cf0dc86dea1909f3a1f1ba4731c91559197681452a87ac29737b9295fcccdb47bc9a630f3a9c404a6655b [...]
+    "GAMMA": "97c3d0a71902be9043e7a5cd8211534ca221f86d0846f269e9a3b1b831def9b4db282f143104addcbdfa7cf1c093d9614a0254f31d1730f53b73b335651c0c345a849deb7a09bba9cd4a771185c4ce6e792fde11db32393909bb43318a9fb26ea0a6dcf0afd8680d0df63d935610e61a18f6d2d598619879a3b13230fc577d7a5275e539a54eea2f6fd95673dd72d908eac4f527215086b5ee66bdc0f0fcfcd71b0c2874168de5447928543c095860fc8c50d9d9b2496c3da69c89b654d5f581fd1e1a8203f774db7da0cfe1bfdb15602b7127fe0214ab1cdef5e01a7ec80c1856a664b2209fc397d129563deec880 [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000834c2c17099b3c5c9cb24fd8c621c3fcec7f28ad68b2f43f8be4087123c79d811321b20a2838fc0b7d647373560984ea3973b236011060dadc4bd150afea13634f4fc03d169f27606e77e2ad212a8239e128d2f2817530034f8bc5de790d6627de2e57bad38b8f7962b963c7d32a4c26076b5060e8a8b0da8f6e55e19b5ae543b59eab13e87c5a75442e1f8cdb80b7ac [...]
+    "RHO1": "0000000000000000000000000000000000000000000000000000000000000000bbe7393a3d7307f3c13fe278bdfe9abc5fb0415ac9af476e75cf91a70ae9af50b9a22d7b836155506dc44ea9c118b67cce41d4116156e04cc9629edd5da4977ba73bf8720adf8ee1911fdc0dfc25ce45b82ef98a346166397a0c1c0f940b3a1984b90776c6fe622efd784f151a730e1128a708e415830e2c766bf386109fb8dccc3a1fe0a708eca77a7d455dfef8a150656c19e014d7ddbe02d4aa20da851e3e51689c50ad6b1deb26dd8cd3835f95eff6ecd43fbfdf936dfbf0db7fb4bb6caf94cea5137f8e9e960614cd17e94cc03 [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d8a96f36d6ddab3ca37986050d9c6ad6757d954eb7537f26d5bc81e51ae1c86c2ee7510fb9879dc689d045d88172d0d6309cb92ab15474d9bb992072bc0ce95864a0f2dbc4e34f614446b281ee03f8031627e05e05770226b9d8f2c376c922fbab3ff41ae9d6fdd38a8975e87af9f7bf3d7a4c8e94218cb99f2d8ebab2f6186ddb27d98155ff0b4be2bd586cc0d5f [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f3db1531a19a33e53c1dcb68cc94de61442909489ea8e795980573f772fd3e8a34b01d264fe03a7beb1982a7031049d2ceb6f702d19ec99484147f9c417b8ff7de7d13387dbd882fc38937ad676249d82735daeb445acaa1a0a5ff68f89fff42464e90ddd8bf38af8e031f3717695cb7550935eb88144d8584651cc710201d7201ff49537fc3d4185c66f44e32b507 [...]
+    "N": "a30a908a793b651d2ac25a68b95530b6ae788a8221df672a695ab955c4537abef256968a68d5d3ac711c5e24c103abd5aeb8bc8464173a55c9851a3b1cc2e79d141f5a10d5ba24701ee95589bdcbfe3c40a3806edcb5b9a1a8861430ac2cf70abcf8f7e63063abb8e1a9165b3c0368e73838ec2d4413e5502c1139a7116b47261f01c931b34f0b57494cea66e91e7df1636d03cdfcb2001cfc33388bcb7141e7dd913bd73c1968e703c71193c194b732c4fdeb9757f5836019cdcec08d759d6da821cd35b9eadd255e28b4d6e840744a0ba9fb3fe492096f8464648fa8d1851ab6a8643b8f29e343427c3524034c48bab4 [...]
+    "S": "828b7163074ade4570feea08fc15f3667ad5f563bcc1ffd112cd2a4f55b41c154686afb36acef6bc7124ccec53ed7284cc08a224d2ddc7c7e38324ca0f5ebd6ed368290394ae399f7764682089c11ddc53db4522c60eb42359035bf822d9a076a059e5b3c806aae3383e8755ef13db6654983107be1cc4cd0a5a12fd316b423f4269f49528808ff442496c1777e665dddf72849d67c4b8f1befa3655cc71f4860f177988f8642af1dc1c828c4b33edb61d915ef407b1b4a844dc37a2169afed4bcd4e791135242e8b633d2687aefd0847e1050a452395422a302c8e8d4589be6f9d628c66162135a5ee0f5bcc097a71b9b [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000b808313d49f13b55661a3198a6ce355762e06af033b5d5ee83a43d7a01e15eca8a55e123be81708202762509680c073629d309d795d147932b7c1f92cadcef9300721c5656a071e69b800a29239945f1b6308564800350b6e724f145437b146e",
+    "S2": "0000000000000000000000000000000000000000000000000000000000000000bbe7393a3d7307f3c13fe278bdfe9abc5fb0415ac9af476e75cf91a70ae9af510c97246b8ef9abd92ea73be7e8549e87cca4851dfe2b5a7aead5edbefbdf75820561ac8f1e1b558fe731f6006c1c5415032a0a5b2c80625cdf34c5e6c8d47ca5d236ecc8a78c3f75e1679bca58c6f802144ad5ca9b89729d748aa4235cf43af18da640e374056599c1db776bf9d60187d763590b3d0d3928c06c23c6c6c169ef0d685d691c05baf95d883536a66a846b57f78e96174462eec16ad69c848f7298e59a022efa7900e54fe4b9c553824623b [...]
+    "T1": "97c3d0a71902be9043e7a5cd8211534ca221f86d0846f269e9a3b1b831def9b4db282f143104addcbdfa7cf1c093d9614a0254f31d1730f53b73b335651c0c345a849deb7a09bba9cd4a771185c4ce6e792fde11db32393909bb43318a9fb26ea0a6dcf0afd8680d0df63d935610e61a18f6d2d598619879a3b13230fc577d7a5275e539a54eea2f6fd95673dd72d908eac4f527215086b5ee66bdc0f0fcfcd71b0c2874168de5447928543c095860fc8c50d9d9b2496c3da69c89b654d5f58268d35b973284e65cffdcea95fdd0179e47cf26e3019fb6ce6ac43aed4a9619cd3000bdc9b91d8f4473ba7707ed17bd9c8 [...]
+    "T2": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030fe12527f863e55e68ecd14a70e5ee47cbe95c291e3bb12427a6bb614b3875f3c8bcd7bd525d6bab3b1c3873858e41dffa2ac81b5f254c39c1d3f048cbb34b0ed0d06a068ae3384382902996df68ebc0f63085b044c5c36e0492d4c30be61a305bc4b542446e82f997dd45ba9c4b32ba6caa133cf3f732622556035ccf27d6fd408a488a8af98e0eb6c881159b03f020c8e003ac8300884577578aea2b0cc77cdb44daccb474388c2b876f7c80c248b5 [...]
+  },
+  {
+    "TEST": 2,
+    "X": "f4ddfd94405ed54ce18c6b5608e6eec038669464604e30ff1e0e288813250aee",
+    "Y": "a524dd3627e860d685304ab20582678746053286890ac6d77e2a2df816abf0cc",
+    "R": "54686acdc3c54736126e087f967a9dcb85b01d794604fd35b411801f62d3c87c3205d701db804b00866fc84e64f22b74fa8e42abbdea1d6234e3c10c60c402d327a6471cbca9c3c759ad133cc0204c78b80680add0fb3a42ad768a3c411d5d8d0ca178d59772b3427aa5d2e00eafa23e8cb2c25e26bde70e009c83093014fef82cc494360cd2000774e27b004c4876af15d0fb21da30380c66882bce9abf9ab7cae6c942bc3e8827674e600cc63642f5e0cad5b0d7966dc5b9f2454fef27bb8a3678d607d50758f896b80591044452e3ee492760c9d09cd82dc12f025935587b504506ea3cce9be7ec0e1fb9bb9e126b7a [...]
+    "E": "c63529ab6f893732fe678edea9a192230130a3e2a55111fc8ada52f58b4c282f",
+    "ALPHA": "000000000000000000000000000000000000000000000000000000000000000089a4164bb493f26848e87530b0c0892394d09ccc4b006e83d48a7fa851d655a62eeb556ab2e1de499f0af0c8a4e208fd342ba1d85f4e69c203e28d83640d41748b006db25ff18f6a0ed6ea0794fb14cf6868ed04bcd2fe8b315ed25e24e10c34",
+    "BETA": "335f6f9594d72b91a3bbf8a10d081e8085efd8ba376a158619b33b06fb77f11e1e8f01b71ee52b9672553314b9d927c6cc3c56f0ba0d9f3e2c4bc346dad46f10ffa2031638a8d349f10e319dcdc2bce50f3f8302cd7de70da4dd95c3126cd853e9b2b3b0081a2d079f8b59b558922081566c4994ee5a850d3999e9f7eb79a2d9c1127faaa9df412e1eb4088b99105e11118d6cc4ca538a2cab2501af4c5e7ea0b14e2af10c2c52c241c19619b388eca1e981facf92f67b6b23644bd08af98a079c896ba0a6137e13cd9dbe41cad87ecb0a97abd7dcce5d866c88bf1ad3332594cbc1bfd402a353bf80f271d9033edbd [...]
+    "GAMMA": "37d71b3c02d502304e99bfb6bfbb6ca92434926dfd5983d5d7701c303788a146f3ed1138746ce77cefc60c064501eed1e29648fddefd7231709e04852a51b4ef77c2007642ff4640d3aba1be68c9c91fd2f059b7aae5dfa3ab7ccf0b2d9ce47e75a1d8d317436787935ba316a00a8de961fbb01e119e8e65bbab6a5247b37b0e9102774bf8aaa5b61f43d12c6f4c8d9bf6a7f155dd8773aba682a95e55f4ef5e5abc774e1ffec0a03de7d97d5f9c2db5ea11c5af7b9f2d93bdd2ddc9d34cdf20d18d71686d1c05274c929ab629780fdd7192636adde8fdab93cf0b890d6b4d75653fdff6ffe5181ac12d7001937809 [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afdd92dcd556fd629a07c1e919b81c4f1623511fc753f47154b25973f33b5331c9fc1ab3775c5febcd46ce60488b947d9fade7af7819082412a10375cb3d6b127208dabd7182c4c3a935bd76dc2d0a5ffc2ced03ab5410d5d321204c126262c7e424ebb7357c9198ffc52f0bf2f73abc0bfea2dcca10247fff9dd3f637554fd92ec1814cf98d86dce0a1afb34853db05 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000002752c45f3be0201f956d7e26fd4036d290a078ac14b8da032b29e3e0b24ed258195a9734eea4f84d8a2165e4dccca03e886bff76bc8e7ee8ad5eacc9bada7dbf013d48dc13ea4519f7aca432dccc21d0e223253a3eb580833666b1c51786c6930d2ed582f5286b4bc7d8ed4160800aec79bb09f5f53610582c43b0c2353eb269d8f5bb3a9141b89148c750a7faf5459d40d7ae3d4db547f1dbd6c2b921300d76c1d9a664142e73b97bdcdaa22600cc030e28b9cb6f7e3b183846e66a1843ed66149f5e04ed5c515a695da41d4e90c2f [...]
+    "SIGMA": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9585a139a254821afc4b439aa0325d969f6dbd3a645b7bc5f23a89979b429e34c1de92da45acfdfd93f19b7ea479b80fbbe300c49f646c23bc278fc4715066dd594852e2b490f74a37058e9c86014371b897eb806039aafde4f44823d2de5ce275f9f451b69d076c24799673ee33a9e2e93fb8c262c7c9efc8053af50d9e4c655a7e7dc232c6894fbac617e3f96b [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab5e21d51357ddb5256ba529dd88fac6a06154f947c4d99c8802c4751ccb5dea8db3a081816cc622cc9c2fcd9fc9ce0ca8e31dfca1226aaa846fdf8559067f9681da62564aac71542c895d2bcb3146d851bef45c8defd978f86829ac14fe2ea63c90f2a04e1dd358154cf2d43e5f97023fe7a40f1e9d3a1e961ed34f2cfb7bbad843eb1627719fa031b621288baa3217 [...]
+    "N": "96cbdb333a8ff518fd3488233010b6670fb4935da833cab78a923c6e5f83b0d226a698dd41e167fb7860e04009b01563bde0e349e8f76f377dd6c6b1a383c4c19e896c019eafd8da3f2fcd57c94a331bdedef7297cac0904f5c08f44a0f503b89196463f4507cb1c29cf086af620b3a43766716bf8797e0fb9561b1de58e0129fee6b028348fd5d8f9b707a23346b6b11316cd1b44b9a18b2be015c9b272be7e01df46f18a9eebcfb3f67f60c76dd39cdc627ad86e622d7b7078412481642a72a0b52daebae3d13c00ed7c75d4d1187ebb8c3767671561dfdab90b74ebc16639fcaf97be5dc0b8d8ffa29a8731db673a66 [...]
+    "S": "10fe4908ac7f776875f4f49cf7a52f18b956b50c5047f237a1d9c517c037c3863c4aeb625ad3fe37134a116e3eb0e55c6f3869cb04c81d3fdbd07f1bb38a4d2273ec6833d6f5a445153c220b7a8dc630433d94dd0fc5ad9a64fff134d9e0f25e2d1303633a519c105e5d7f98828c4947917cfc78d560b46be4ef1cb52bd73a4033a34472eed7437199dcd0dbe0d0d0ff5672b51f59209e208d69ef215c369abea6bd3263f94245643ed291d308aa506f51af461aa90fe2bd31588fbc3c6ba2f2128f1d8b4f180017a7d2b27e2d423aa4bc88bcd2ab9511d7f5756b30ce8490ddbf06479f2afd38e64f9c9ee70ad8cda9b3 [...]
+    "S1": "000000000000000000000000000000000000000000000000000000000000000089a4164bb493f26848e87530b0c0892394d09ccc4b006e83d48a7fa851d655a6ec81e15c64f12bc7e25749f138c9f35d2894a3af5fcf013bb934c59468f305d1651c2e1184c41aaa91649be632a7e96c53cdca18081dac5da1b8040beb0b3de6",
+    "S2": "00000000000000000000000000000000000000000000000000000000000000002752c45f3be0201f956d7e26fd4036d290a078ac14b8da032b29e3e0b24ed258a1847c4b65843924ada5556833d5f0996b9403c227771ac7dd8d7940ef7ad2f8c2bd0aa4336db97e307ab85a9cc1975e6f184ef2628988705a7009a89a4ded0dbb334421ffcb35585de862c8483130d1cfe86eb6dbbcac8728dd364b0bc4e57501f0c260bc570744b487548ce91967e05906053c6c9401decae583cd0bc8946d97ce0c333c1bdfcd7b6afed5b8205fdc804b328eb51e1700d304a3cee8f2c1027420e496b2e924fa7191af19192c58842 [...]
+    "T1": "37d71b3c02d502304e99bfb6bfbb6ca92434926dfd5983d5d7701c303788a146f3ed1138746ce77cefc60c064501eed1e29648fddefd7231709e04852a51b4ef77c2007642ff4640d3aba1be68c9c91fd2f059b7aae5dfa3ab7ccf0b2d9ce47e75a1d8d317436787935ba316a00a8de961fbb01e119e8e65bbab6a5247b37b0e9102774bf8aaa5b61f43d12c6f4c8d9bf6a7f155dd8773aba682a95e55f4ef5e5abc774e1ffec0a03de7d97d5f9c2db5ea11c5af7b9f2d93bdd2ddc9d34cdf21516a40039b30f2fad1dae8156508bda4689eacf4fa5f924385800b77c9a08555c0c19fe0d9a860f8f7914da4e3eba199b [...]
+    "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e220502363155b3082b6e0e90ad2f1bd3c1b8fc361b81994cd55983c1ef9207cdc054158b6f869f04014d05e8edc8bee2b06a18b84a989edadd1134deec8db6a3c9aa02025b9f444572591306584ac90a5a441201eebb472c46fc1f6be9398045e09170efb503735420dc172743ba9436b266b109348d3ebd3e80123d81286f4d2162d239c4fef6542a1e07e2d67020df3234b9563e922e025f665c7ddf84410fb1a702ce1a9bcc2cab7383588e50068 [...]
+  },
+  {
+    "TEST": 3,
+    "X": "a6a9cf4bd4254c60140a4e00f0ff4040ea8eebcbef55e0b5637a75b491d49461",
+    "Y": "9b1da3500f963217275c127aa54fe1b02cd167d9d5f7fa9bc7333d40e5851f0a",
+    "R": "3c77b6726157e880cabb2bfd408435d64251a5134de5b59cb1f3514eef88f62086ef3f0e9db952403782e0ed25cd3bce513f4eaf916bcad2b1ecf3fdce4b68a8dc10693e1aeee76cb1e7001bf746618116e7fe932c2aaa9776e195b96f5c18b5c7358899a341d49de9776998c15cba213e0394e9f83dfa679688fa622f0df53c4871f7259cdef144cc0340462d36f77b221f6c8665f1fd4988e4f632aab5891d7bcfeb099919f2f1f4ea801585b7b2a149e93e25ebc9009c4f3671218d891f051d98c9565683fcaf2e42c43843177e7a1818ceeaaaf29db194148d7f9d0c5e2e103cdeedba6df5dbcaa4218349baeef472 [...]
+    "E": "3d3365ac8890672dba5994e58f796acb5e6f7ccf6d1c9bd9dc5f8c12e3449ece",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000cba2dcfc183df80f77aa4e8f83f3d3783f5ff6b2af446c2797dba02aa0c7a49c4f01db6469acc95d7bb65f0323874a7e0a9d06dcbb2e07cafc7188fbe61d2ae307bc2bbe2723aa9b7138b6cc1c679f8fe3b930fbb6b6de62347acb3223ec3ca1",
+    "BETA": "a9716d1833a7056f586c7a16040efce6ae6a3640247aca5d24bd8954d57c440c9ff55f53f4485301e3d2fe854f243a9c6a79dafb8a0478a9cbe553bb3223fdfff8562fedcd970a6f1ef7a5c47679e589e731be4001fc37057d6bc4b90ae59452f7a266cfd5a7d19d684b0bc64a69a2e049c11204d5c4db1d60dbd4a590b6c2b49bb780d38039af5c42b4d0b92bfd7b73d772022cf2f0467b63c5c32e6fea5db8694b5e16ea3e08178b460377ea4f24b17297e2d3d11c3144ddac4e67c5e8e02ca4ee8dbc01b1832fd5a70a3312ed71179614fef445ab82949a543cf00867b67754cc453af51a9969d7e944825bc582d [...]
+    "GAMMA": "972bacfd9f15307be138cdcb6af37579a7b00ef035e4577e3068bdc2fcfc897ea46c32153e2c5a84df02c3cedbf021a6fea0321636819f9f22a7e0b596533b9d8cc218bedd570cb97d25d133bb460ee9353378e4fcdbd759234a196e8402d6aa870bf0c90770f0ee34bc5ee85b916ac9b999b958299ad9b7cfe9d730ef50dcd51da11fe28e5660847755dc2edd4c805f517992ebb2f8b47452beaf8c05436645827a4f04ea8f75c4d487f3cf241f6929ccd3d04c883cd2848ae55ce9edd758cf90db780a9925bc6bae0a8f86d8f52a9ad81c5c47331af0cb16e96e808cbf075775e1d3e9dcb5c26cfbb1f276f5319a [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d164951d9317c7242cd9def6aa694109cf511e91129f61967c595454657a12fcc2a48c87e288511e7d5355bf646395b960c2640b70bf17fe2f5496939247e974669e3ce2b95893cad31dbd7b8d536945b0a8c5a59d17dfd1bc31301f4955cddf6f3ac6357752433f81a64c58b1dbb71f646c2554d2c9f04c435257100c4937cc3fbbf9e77a90dde4df3b3589487bdd6 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000008ce0b500d59df9a605a9eff9768840905bec167a3b87c4cc26263dea552844b32cfc5dd8cc4add7ffb80e4519f85a5e88014e377d1c3d24c945b77eba69b9e9caed9a6cb745b964a44ae4920961cdca1203719272c8d8b5d2b70c8db45a4012a6a1d01ca255dc6accea9c2db9b3bc4e33d00ddc85e8c7bafb48ec6d44add53c7de31ff6652e7e7a742f15cdf81c6790152a4366317fbdb5b11f727722aa15c19957fa9eca5d293d2c0593c24fe87a17ac493fc8a5f5bac703b42ffd6399ca8517b8fabe935a823f1c7eb2a536913964 [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363b5889f0a49e234d049dd3f93c9a4e11dea03221d6866a5918bf9106b687d136bd03eb4cbaeb2fe62da10b1c05adbd14b4175c6584fe53de36a7262b0f22e9d7a27af7a63c3d5ff0fcddd90a83382f4e1cc53adc2e9e42f4f18264e493b564a3e40996297af494cfcecae3fb6cf9ccbabff68e84a27e26125dae719861555513edc1bdc581ea0a56d2ab8ed39c82 [...]
+    "TAU": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b05ceae1765ec0a9a7dbefe1fd7575e2ed746dced5cc294bf2120bb0420202af9ef0c7ff4021e2ce7172a3d76b6225c7f985bdd260849dcdb1817dc486d89dc040f8696d98f8d7b6a4d4c3b985610f3260bced4f3e903f4659cd155ab50736a3c4503c886fed452f7ed71c02d48b8e7627a4991778441a4a0ca88024ee529e05e5542bfa2c9d804b1335ff179b687fa [...]
+    "N": "bf7530dc0fb7780ee71ed25da80c0198ed1de4aa6b950ebb21682d9859fadbf17bd609a35e6270a21903365aa1f4eb215c0aa414fc54ea9575e6f1a2efb27e10badf5f32377687d8cd9f28b40b831c0faae4f16accb81d18c026e8c4602af9ab4ffa629ccf29504663fb7c0470799ce296cfe403bad1b0a79fd7cd6a38b8c1eedf0cb8fb2a1bbb9604eeebf416957dbed1d11e764c6c4e9f7024351c828dc946d0391d6e1d09e403c383e8d0148d6d88516ea91f19a81cf9e3a9b2c596ecb1996541bee928ba109a79391e08c8fc977486d70752abcc812aa7b638b9cbedbde28c63af3e3a7bed0190fd4bec93bb6c0b45 [...]
+    "S": "2a6b8594d8ae7aca0c1f54622847fa13ca01b6aa869698b91dfaf82d76e2bef8cf9cc9a5c7c31fe66835b505b552537bbeaa9d2d5dddbd98519ad34d996ac2971510db4f428dc9217e25792ac2b1a036addd9df7950a24508a166af14de8df42bd6f7ff346b21d9ba26ab3fb74e165c9a5a0f115963ec13b8b22363bd35add2c852df3fd68165b5896dd8a66122968af4f88b5791d51053fd12e8f01cf66b5a5492108130c4f34c988b080fed78adf45c9acfdfd113b111f15cab1b6adea1d2492a073df36ec01497dcc9924b655167a83f6f75146570eed37abcd93b82066ba1d0b624e646c4258b8f9559c5b83511247 [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000cba2dcfc183df80f77aa4e8f83f3d3783f5ff6b2af446c2797dba02aa0c7a49c76d9c7cf191d5a74d2bfd4ef8476c212b8d4fb921ccf6d712e34904e373df65b720bef529c245ce54940a24d5dd23988701d33d682d9fbb62507ab5c1d5380af",
+    "S2": "00000000000000000000000000000000000000000000000000000000000000008ce0b500d59df9a605a9eff9768840905bec167a3b87c4cc26263dea552844b333f0844f4dc4b9e7568b89b2db816ddcb863579201d0a7fd33a7f2b8111abff038c790cabab4d5926f3e972901330bedc5d2350f4d78be39e3918d63273b39458f8d56eb1b20546d009a8f5912ee5e330ab074bb9c606b4acd889930f72b78af2860dc20e005bd16cb78acf27eff51bda1b0164bde015a87d826301fb3d79d6b209cdbf542df8a7341888013df447386f0b9d7084eb9a0a676cb3043378602cd1d02054fa36a2b07cc3a8b65674de3d97 [...]
+    "T1": "972bacfd9f15307be138cdcb6af37579a7b00ef035e4577e3068bdc2fcfc897ea46c32153e2c5a84df02c3cedbf021a6fea0321636819f9f22a7e0b596533b9d8cc218bedd570cb97d25d133bb460ee9353378e4fcdbd759234a196e8402d6aa870bf0c90770f0ee34bc5ee85b916ac9b999b958299ad9b7cfe9d730ef50dcd51da11fe28e5660847755dc2edd4c805f517992ebb2f8b47452beaf8c05436645827a4f04ea8f75c4d487f3cf241f6929ccd3d04c883cd2848ae55ce9edd758cfb5f0ac7771e72f2aeeda6bfa5871279d4de178f2a5175e309489559f2be60565deac7aa5f2717b8230911643c5fbf190e [...]
+    "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf70775788e315f315797cfb3c9a0001b9deddbc9020de7a3c03b526885da3ca1041e977a846fd5651f79cf1271c88cf83d9b61a866933bd0449edc6e0c40024b9534a60ab38c2e0a6608d0ad460572b101c7b70547a480be393bd9f7913c06738596247a9299736f45c8d5cf1cf5983702389f9c1fdb2c1f05ae2dd7db77ced206fc96b7a6b16ce92ab49a6bf42270cdb540aa320ec5c5d54dce9e8342528de6803dbadde650ddfae086165f2b3b10d [...]
+  },
+  {
+    "TEST": 4,
+    "X": "4cca5149f68696cbae96b8893f6a326ca7ed9bdd0ad5c8fc0b76c2e853ae3829",
+    "Y": "81129c78feff170ce8e674d12ba194dca4e69c446af5cf800237757150bc6b97",
+    "R": "47c7f5384937e3d3cc2d3b278ad231f5dc550fcffdc89bbda4374292241cd31e6de0b06e2ac24087bd3ef7904ee51246aeefb6a56a319e4708542ad01d766b50d143be06d5496982f62439073779836bf57604180c4074e985f0c27e47d7d23db247cd6c158435f686e25a89011cc38ed4ed933a4c4159d9d9cbe62ed674dd08931faf9cc225dc76ef50a2b2b6a63d9ddb0777741b03414f190370437bee658d8c792c82c9d80e390c2483cec6a719c9f5d93d6ba753508e446ee173829abdae85c7efa5715f0267b61c5b06005153f08ca7e01c956cccbb7e12833e2fcae0c895963d46006074d3a204943404b323b206 [...]
+    "E": "ec220230cd217b754b0dfade659888e2f227784de4fa9aa72bfad4447879f47f",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000b9178ca2c9eb48fa175b096949c4fd85f49105bf932ad90d966681e8b47e3b4e1134d65f9cf48a3f18e3e9eef02464821e3fe7b41ed199b6bbd8d22afccead725c0c3a90a63df0e0b3a7b2238840727ff50de68ecf186d6d2c34b2b866a22fbd",
+    "BETA": "0215e93acb85456fe55ff112b8060811b995cdcf2c04101b3f881a1a16a239d69e292413f97f79ac9f477e487bcfc8a04210f03cc873483c291d5fbbb6a33bc02ef3403b9404a0f9cdaea8a13234a696c74a0e0c5e1e5149e3cef54271470fc34b9983fd4cc19ed275d9c6b38e486e0512fc4c5c3eb50a4b38c38f4f2670b36898338ac8dc992db396e444edbca0c1d181581060b6316c5ec6009ed4d5092ddbc21f589f199899304b391bd6691790a0dc5747141c7979c3456ab93ca118ee10510b072c3c808876b1089097ec7457402830ed42edab96154ba5eec21005f91eacc6c41cd071aba7812512c39861b22 [...]
+    "GAMMA": "42a90dddca4df048e8627b66d5aeb61f4bb5efa0eeeb56fa15e30eecc43f3aaa57c675565a4d7279912e390eed9c11fa98f336bc82fb9fcb04111115e4ec7039803a971e21925703137c1f922cf332a473fd32361b6b9a6ea22bd209955bface4e6e2cb6edde57754a10e789585d435ebfb075684a32948873cf6a4c9db5a307a46c411af4d14cb0bb72a4d823e88650f55c3873ee7f28b89323473f196c989333f2af4a2981df1143d50e17b5c447c6fd4cc8ac7f8acfa55bd528597e4bc477957e810a806a6a64ea6bf0a5bdb6627b0defa3bc8f9285ae79f26c6d6e67a9d7a995ed42b29d06e4b944cd011c74d5 [...]
+    "RHO": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e1e1aa2831b2a2ad59740d89add71ed465ed10050acc957ba189349f1dc516376c4a6022ff37b6fee2a5d2777a80a1e662846df7d5d017a12cfbade16986fc21062deccfbe47f0606fba5c5f09099746df8c9b78913252a83655eba4e0c088207f8b6d5fbc42a62e2d80d996591382a9007b20887e946bf300f576a7e3ae9aba05d40b60063af9042125f533ba8cb94 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000004fa7f31528cf28a8dc0eaf041b7111f64cf68fc4028320d3465e50a6a62543253f67eaa152bf97e88b86d3bec0808e98a51f7b58f5961c03b1fec3afeab5b86944be4d392d79628504711299d40359a226425b351451a05ead0cd08475e3c6281f7b2ba44485badf22e8a0ab95f1ba3e589933caf5323e845359aee5e21771d2246fe7ea60cfd2de5dd4b2215ba34d824bfa4a00c820cfe14837ebe38a5bfafb5e327be69cfc46baefc37956b0dc220105b11042d2dec5296c58f3af28f4611541e63a6a2928bd67bfa5ada8a5172ba [...]
+    "SIGMA": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057627cb771faff1f1facca252032d965b2b09bab78f53d9302e8ce2d3674369e1ee0e8e3db9271f014c0f343950d957e76cb983a71a4f6035821b64583e92f37c267d5694d25dd06fd55e74b69e8ee0ff5ec1dc4517a969f8a8ad7868212675154a84099c9348ff15367f868bedfeaed5553002e34a58aaedca9986ab60d87ee74f622a29af6fb4be0c6aa49b58ab9 [...]
+    "TAU": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fc79b33dc2a8d8ac1dba4b999a31856b1d38e1468518199ab52103791999adf30531f4d840ee6f29e016dae5f8f2cc27482eef2da5b12ab94d2b1e0537c696faa1388e789f761c05ab57766042958c9837b5192da2f7ee45342b82a18de10356e38385d50a020705fabae6d80cf624288d2843152a6961b74ecdb258d4d370067122f6bc1313ef6b9607aff55175ece [...]
+    "N": "adc4434e93c6ac815d30816f6c3c9d8e4454c57122a5c394efecc034fbcfa88465c9af7f41bb9d96be9841c7467c298511699feece93b6bf870ebbf506b7c43f4bf2cd4bd32f653bd6b6791eb9331e932b12c35de6e2ff76770a7ac7819bdc8b0a44e8b00ce2a880107a5b5fd432979bd6231cfda818216ef7c7e780d44975dfd92769b096d25fb0ef9dba5399a4a27a756da9670ae867cfd45c15860edadb3bc140fc19ac670251e09a893e1d4c4ddc5d10333bc80593c6f47fca2435a71ad933e226cbfb332cf52c50681d0d2d924e9b8792337068eae461eefc1dcf44b344b59093760e06e926dd6f57c1d7c3475aaf [...]
+    "S": "530152fca74cab85c5bf99776b5e2ca38469c75dfe78fbff2ca22bb17bdab58d4f85c596bcf31091b33746191aa3b31ba70bb489e8fa8b0874666ece7b89e52f0c6ee14404df278ff19847af1742d12cae38197c037d300fecb00d09a52b7e1a51b174da39cb94f9177edc4c18b46b72207bbcfb8a83553ab8f76c2d475ac1bc008afba84ab2b5b33167b12708e260d45c9929056e77ee6c2cee092127df95c29c08372a454628cf3931eeda20cb02d85382272d8beff28403ffa73d0aa1c920eeb5b005681ab61c7b6fa9fdf79680bc6c5729b32eccbf7270f29452d815e14667e80ddc4f3127fa3b38311bdc98cbaa17 [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000b9178ca2c9eb48fa175b096949c4fd85f49105bf932ad90d966681e8b47e3b4e58098cd6d0253b2344499f51d8d89da927e4602928565be65df4212570f2544c46556b281b532856e291fb5f7f37bedcdf7064579995e73650c0ea4bbaf82014",
+    "S2": "00000000000000000000000000000000000000000000000000000000000000004fa7f31528cf28a8dc0eaf041b7111f64cf68fc4028320d3465e50a6a6254325b3bc6c42f41ae9ea3f027cc4e8f810ff05dd5227c547761eb861c741b67f0c168f07e4817c43ede9ab578a4cbcb62f27aa1cfd8c11a7e927a07fce0fec7005b96a352821485a4d4c020b4a1e933a54de0f4d92dfb332fcd921f88a960d175f2f04017d16c92e94e5f0778fcc3170a143a22d9d84a5d8d011b409fff7cfe797a48a773492f383fd4cbadb656bfa7cc9646a4dbdeee535544bf24884cf3e08f5c9f7dd19c17f28428e435089b7569278f15 [...]
+    "T1": "42a90dddca4df048e8627b66d5aeb61f4bb5efa0eeeb56fa15e30eecc43f3aaa57c675565a4d7279912e390eed9c11fa98f336bc82fb9fcb04111115e4ec7039803a971e21925703137c1f922cf332a473fd32361b6b9a6ea22bd209955bface4e6e2cb6edde57754a10e789585d435ebfb075684a32948873cf6a4c9db5a307a46c411af4d14cb0bb72a4d823e88650f55c3873ee7f28b89323473f196c989333f2af4a2981df1143d50e17b5c447c6fd4cc8ac7f8acfa55bd528597e4bc4780c8ccedd93b28325d32c099daaaec33d8cc6917c6bca6028e7f30e010a753dc02c7ead0a1bfac8f2718e162a3728e9f41 [...]
+    "T2": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000509a66cd1ae6a3853ddd06d007d8e441968be3937c1a91cec0726fdd917c92e41c01dfa1e798d7ca2265816af074d24480057db499f737bf0a3bedd551d3140c4d190cdf54206c81b85ccb1937c3b1fa6c3534d4eb8cb01d26c26e321f674ee6bac7a2b214ac38c790c9629a692f4a22bac2a4428e65fcba62e6765deb374bb0bd680fab60e4b1979be8696f1999a825980c91810ebe8444866a13264570fb557ce979598d30b530217df0d63e7d4d28b [...]
+  },
+  {
+    "TEST": 5,
+    "X": "254b620a7ba74ceecfc48d15d9a9551f97d95c5676ad14427babc3897973bd9c",
+    "Y": "c8629b2e10920ea2e55484fe2192eb3bd175e08f27a76156255292697f48c13a",
+    "R": "15b09942a2e8e5e065828c6d58dd9abc56ce5169c4c3f876948a81330c517980c2ea49ae3d1fe7274f82d1b813ad89e1eb953c685a99f78d4de2ba46b2ed17fde552266768e85cbb931cc0b3be0e0a300e2c99f3732cd831cfde4ba5ed436f79873188c87ed8a327de9470fe31c3360a0a1283a0b90482122a2b08ecb447ed4df3feb7aa9736e991d89f0e9a0d75c3739e85cbb16ebd33514fe9d297dff792eb5a6e77c30cbe03209abd41d27b5c4fd4191366e1bdd5e3538dd70a6b5709076e004f6bbdb7bfeec09e971a702196586ea1cbf28ddfd76dace59e5d71dff23a8ef8951125c00d73a8128faa925e08ad4b7b [...]
+    "E": "31e5ef49a58032c6e64647f67c41120522375dd417ad6a14212acb9453192a7d",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000e34b696d5c08cbc44c177980bf2086c6fe28347680f177d1f4dc4c1bcfbae945f7d861203f1600d78517d411ef9c37cec3ab5ad4cc6e9deb272b8ab99b53f48c4c22425467bbe48008108db7fe12b953d84390388478b375910e8c8e415a1963",
+    "BETA": "c0fe5511af3269b62eddc19ab161b3f7927a68971c228f46adb76126d9741844343634e44137b87979acae9ff08240d4e44302505b2b12b67c86fe4686fcb75fe166acb5f3685f5f0d3da9773d5d32e20bf778f44f708676d86a66244476b9c9b305bdce3c6de65b9cb6ffd8ac1447ead4da29d1a8275f0bd90768cd459339dde399d36e458c85762e460a56397323fea071a4ba7dc6de4284dcbe502158e71838ede491df0c99d83e3eb716e4cc1695c6cb140e9c7e0dda85cadeecd97126e43fd1c2dad2b9da88857bdb395b11de53e862198b8bc131a76669538b1c6602e013dc879e810114c647ecb9592ae7269 [...]
+    "GAMMA": "20db236d60112b652dd209f0a22ef49ed846e8521c82a719d9437bfc31be8ab2b20af3f328f0bb441c39943661133ad8623a8a0865a9cc423272a30794cf183298d1bdba89c059dfe96690edee1256f269b09ddcbadbaf04a6a59899d1c21ac51430d25fd847ea8348f99257226f8cce3fc8e3b39b7212347c31f46ba1682d0f01baf5742acd6b104c934fcc62db968f5ef1529d39b783bc87b6de12238d1e197802bfe8a25da0243ee57afbe5656029f8c52e8633835c80f02f3a9a9562177d07478f89e481119f9c9dbd1a84c918c9026ffb473f4ce30e099bfee8475623cae9b49449498b49e9c64e1be1a6a2af [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0e6fcff830807ed9547ac5beacb478fcbf05cde65f2a4a1b52f1c367ef68f5c12e04bf60cbdf7e7c220e97b5d3b86c3fbd9bf75f560d9f0971d4bbec7fd5f4c5e443fe0c4da55031e6a925fe9a30d250a7d9b2527903e9032da122548d037a7a63e33eb24686f27a3e5d611f05743c5fe72d872ea5c4a5bcf259cf7d32e29b23dc506e2f15e04a049f9da2f9947e72c [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000004af2d2c42c6d6047f4a3b5c32278cc0b8500fd8a3dc5969837b6a2416721d93d02baa304ba1336619322e0d9f331f7ec009ec790cdfb5d808d073be9144cb3e580e6c6c42e4880703906d9b4d69c52c08bf4999105a88851f024e43c43217552d25250adc4bba39c937a2550fd384bb340b08f3ea4830924bed862cf29aba5b04d2053dd29d1f7479238c97625f9545b743c1878753c67093644809138a1fc29387f4002ec240b0f5442f1641726500518f101e89c5585baa616f2df846698cf89480e833f2159a6a2be03de978053d [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6a6153b24c32c7653431aee53b26e7b0e9cbf613823263f3a47727c726bb2a30d1446fd33f60f217371f14059220c771ada010ed97bab144fd738083fec0d632aabd8ff0155bad3018a587538faa7842e9a93dedf3a294536a52af896583f0a61006dcf7bc6e325b0660370a3246bb956894987906d7d6244267530d141d486b7da1992a820e607cd36bc6a510fae [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098656055ab3ccefe014470d98c1d5222d8e82d5a37f10db0f75334672faf9a9aa8e5c10e5cfbdbf38552dde47b550793b4eccd5593e2ab43b5e8762d3d030c9f1b6e60ef4dec829ea9cd985ca5cc6b86046f0af668f57f73d1f15a1a311483886d800a19f2c83099a4eed36c2bb341dff5ec1fdfb3448545769aeb850032b288e6fa573a10b6c6511596db1c2594cd60 [...]
+    "N": "c551fdd2fdb5cc995620c8cb258aa658441aba5435203cfe72048c95d78df40844e3feff2a45ac5c29a4291698ab8d3effe4dec07c06b6226e850953587e58712cb51d3694981bc762082353561d1e5bbaa59590c47166d0bd8be79178cb458fb92f476eb5943a6463afb4823ff50acd106873d0eee1634aeae4986f5115ea60b84213a4819a7b96ea811a245d667ae13d8d70c19157bb5de3cc41e173805b233a5f608a4b48af245c305c967e1dba4a4fd052401edad6126457d5910c9c730522b6d4291cc2a6a23ae2318bee8e32acc98560d2bdb2219e9ba7eb0590e348e8ff569ac03d40a4f0a881a546466ae71997 [...]
+    "S": "19163963ac40f3b2a68e4e1e0f3a7b211a4cb0fb7f0fc3d99e66d26df29369f2477472193a700dbb263b535f770e077e4129594fea7f1bedb9a3bbbc89920c4cd17d7a5e47655549bf8bb4b3c19cab093113760539b381c9cc41f2e2e863b57b84c637cb2d25a8dc9996074507580bb1c225b515ffc026d79180760c4fa2c4317e33fb9a8fb85b2e154904943dc37bc816b137b40bc0aefbf539543fa8f88f5da1e70108140eebfc4f671afe2d02605ce0999290b71205eb5b0b71856528e55b35a9e6273ea3098f0d3a65f295b3548104da1645ddd1da8e703b7476d66df156fabeae846f0b61d4d99d9f3d2cd7b217e2 [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000e34b696d5c08cbc44c177980bf2086c6fe28347680f177d1f4dc4c1bcfbae945ff1d4e2f0f44a4eef9f4b1a3d003e8fea884a4cb049757fd0e7cc98e1c28600b330f49b3cf5d54ffa60c4f5df37fa009cde2c4bc756f93c902ab4992a435468f",
+    "S2": "00000000000000000000000000000000000000000000000000000000000000004af2d2c42c6d6047f4a3b5c32278cc0b8500fd8a3dc5969837b6a2416721d93d22175e77e2ce1abf50f02d1af04c0c6c6299d0e887b42d5ebd031da4b7fcc6b3f75356d94532aa26227cb8b65b2c5ba0e5c83536b1ed80e7e684c83b20330c21509f5980d95bf9d274a987dc22b123646673eefde5f3dbd2991b69529aab4a44959b2469b1e976440ecc62f131499f8ff7a00812d450477e652190d8c1bcfaadbea4781e657a58b4a155461a516338fe9d34d6b3844582177558bc6b831191e861f0603ccc75287c18999ea018c5f2206 [...]
+    "T1": "20db236d60112b652dd209f0a22ef49ed846e8521c82a719d9437bfc31be8ab2b20af3f328f0bb441c39943661133ad8623a8a0865a9cc423272a30794cf183298d1bdba89c059dfe96690edee1256f269b09ddcbadbaf04a6a59899d1c21ac51430d25fd847ea8348f99257226f8cce3fc8e3b39b7212347c31f46ba1682d0f01baf5742acd6b104c934fcc62db968f5ef1529d39b783bc87b6de12238d1e197802bfe8a25da0243ee57afbe5656029f8c52e8633835c80f02f3a9a9562177d2e566ac03a6c01c032135bc12f6c0d0f3dee5bb62470926c419935445599c0bebd93c4e4527024b93f05c8696d5ace1fc [...]
+    "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002399d75ae934063d331bfaa8034aaa33b62f4c4cabf8a42d1df2a14e80f7a65091042e5a72cb2f2a540b2898e228620cc58b1b8f05613c94d88f46e4c92152f55a3cbbd941ca4155bea2973ab6a9b6cc54ddd84af061e6d17d8eade8a5bfe0c65d4839e6ecedf721427f689c0354e8bca1f8687bfbe7254848413b2f2a887b188408c57fc9dfedf9ed1da03ff589110296ef44e08ad2cce6db0ca1a9371405b466463ae1b8c62a41a5f39f468d748f5cf [...]
+  },
+  {
+    "TEST": 6,
+    "X": "b78dfcb4fa4c2f71902ef2781d535c6350b54984118cd73811be34dec3d080b6",
+    "Y": "a0dd6ad4fd61a1e708fd60014cd877301433f0a2dc359bd6796299775a25fd6a",
+    "R": "65a34d1a9c28ac6079018304c177b5361d53dfdb203a055106c75ed0b8dc8446973e2225d8eabd2a6396605a8ac02d7fe1e04b27059c5966560970dff3696e94517a4d3eb7c1abfa5946b5c857cb11767d33b2b03136e0e935a6b320cacc44b53d2419cf2dd824aadb0f4936ebf6b963b51d704e9d28c601c4ed316a5c43f3f8ef5d635781918c2335fc9bc427d9454ca7a8e7e1bb7f692dca6b834dea4e3a460ad6e3baf92025b3fd1f43327c5ceb67953cb988012c5120263e592b94a6fecddd4f0caf53b9e52fd9d60bae3c5ef323e9990f52dac0e1039fdf9f4cb72c21ec3014d027dea46e6650ad1358b793e8aa16 [...]
+    "E": "e081cefced7e639fde78320b57fc47d3a32e97a2bfa7e3d7cfe5794002d5482b",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000ebe417c4efe8ed041b497b5f077ec4a6f894c0ee367e4b1282dcc99d2bd27041fa64adc8778dbe92d3acfa528631b38c127882f6c5c8d0328773ff42ab72a9bcd76d891361daf46c45a876a92a93155d7eb2511e707e17bc34cdb8aa4bc58e7b",
+    "BETA": "5ff86bf842c2d43b726d261335b13d43adfcad186883a0cf0304de059b8b1d77f8364853b2434ee920e3baadb627896d58e25d4fa18a7972f6d5e360cbbff9eb4660608f25e393ad815496b1c08718bc599db02aae135e29c5db050d599a7390fbaceec3e257b4dbd4913a345d58f576b85a7a9fd1ab32bff5a84d055ca597fd1e08f9291462cc4e17af0558cfd1633d0139bd74b57c6b8e00bccd2250a0252f6fd02b9196653221624d08470ceebf4a48627bc0459d6ac44d8faba2946b73363b3840d845edc6555d817e00d03da016a2e335f7de640af7710a7503f1991eb091573233beb7fcf2aa2aafea0dc45e7 [...]
+    "GAMMA": "a397e06a2b84c4648160526abea097677a5596847d54df824bbedf92f24d1b2ff0806cedc8d987450776c92a2c79df3cf61459abb9355a0c2e970ec185bd709d908c3b0d2e2620e84e355747529ad4de81df5945544f812465891ec9499e1ff45274db51c967922635d5b4b081a0848d978b5c5958f6fe2926d97d19e2536900a9c981466b6f47313f5dd9e2f9dffde550b676874f224a87a84c3d6f864ff1e2ccfbf1a83aa886da2543ee3e31626662c49e8ccf54908d2f1d8b8af15fec965e023cddf92b2fcbd56f939312f3c22c3f9c27a40c75cf5cbb2afce56bcaa84bd296f5a0eca20f995edbb215b026e153 [...]
+    "RHO": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048fbd224a8605d7196aeaef82ca27483e89abf277615bda41cafe1e5fef6ff67b5b316c97ce96e91d92539382ab63a5f106a3304dcf975f6dbb92f4fffb7d2409a7f4aecd11d869182ba78dee51b218460a2d80ea51b55cbe63c8b22fa838c39cb44ab6cbccb389f929a7478962109c801e692def825351b7434fd31dccaf4517089ee4cb883d88afd21137468bc3928 [...]
+    "RHO1": "000000000000000000000000000000000000000000000000000000000000000059b2dae08b1fb4dc273f7997c5040f5f7c787856ae579703973b747cae4769ccdabec5bd9f4eaa339a49a2735cde0fb4ee739c444ca21d624c59a4480743b3480155064479b7706145405c6684d7fe4f394249b0d5fcdf779d520a8a9f35ab879a6368aea7cb54eb91ada887a41caa7a786eb218a3dcd90419900706f5283e1a244d1c2ca970c8ed3ff5fcabd363b47a2066a880290e80f2887b0850e08f584820bd456ae0620e9f769708724becfadc7a325f2f51d51bb6a11785438d80633451e0d48cc13d3c77ca9ab66914312da [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4b2f7c9352bba8cf88e99709064c62cc47f6f30971331d7496e2e59a348beb54802e0d2dcf381a9f56777a73e1f3c9fc8753e2fcb85f6eb862962adf1130618d2c48befbc03e62b2deb4922016004eab75d02ebd59037c983c908e518eb58972e1120e39c524c9856c01b6cbf085aee528421482dff52a25be74befdf57a7482e9e2d3a3653086c29d1a1975dd6c0 [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8f92bd21dce6a41b8c1c031aca8bbb11d7d76ec2c2f3d0b6527f9ce3b6dd6eb79f108a8506a3594149f1e27364969d3ab0816daa0cf940807a16d4b7296440508e1d9b0d048fce284396096c7214c43073681d5abd15274ffa76a572bad6ffecf4c9197f2c5d18dc2eec3d54d264dd68c392aab5145be63afd26a0218b36c0dfad5b9c9689f2653b5a93620ffde50a3 [...]
+    "N": "c0e0f1dda0c263b60299ac08509d6c123249dbf2677cad37b4bc600d15614111b3e53f10e7fe8ab0ea7ca23e3ca5a0b818229fd01343e1ee8e55a43f30433e8259f28cfb1081b3ef986afe7940d751098efb1d734f9642f42cf406c5b99a6fcd7ffa152dc9d5c3dba58b7637517a6c5760479fd23ec6ea1383e940e0278fe8b72d768e42e7ace92185fb749ea00d4fa077c6c9ca4626277d7e5b2c55bff6278fa008783ae58c798311512d91a2fef34a3d01745172fcde80a0e15d0c943f8f5fbe4671e56b1a916da3caa1eff2c2875a885c57bdd4035bafc561b4332034a2b7ff1cc0f858d44cf0e057f48baf2721816b [...]
+    "S": "3d6aabc4b7375f2c2dfdf7bbf27940ba624a6d6a31217a72193c532def3e7231c52c2713607297227bc61a7369985ca514c43bf337177d24a1b9210c4de5b845ed40b566bfa5065af7ce012ee451022b0054667db37b4db4dded010d4966a69a24c23a5d048eb590e614c1e6d42358e13f799e5ab4b98504a0283f95f792739135c3c41bcc29f3b4edda35b1a2045f8e21e11369231d4b457e63b6ce7a54baacb3ca3e74795f64024b7958cffcc4aecb035194fd8106029389b41a4f79c2927deed5c0c144b5773d2d5ccc005b785ac66bc44488bf8c54b41f4bc2b17c1ce3061bf974c56d604876d19c4dbad365ae846d [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000ebe417c4efe8ed041b497b5f077ec4a6f894c0ee367e4b1282dcc99d2bd270429b5dfddcc529fe4e4174c6272f2e4ec476de69029078bdac593fda9ea148d4c07f3e04a8179cc9110f52d630fc1fccb936e386575a95017f37440224576c5d0d",
+    "S2": "000000000000000000000000000000000000000000000000000000000000000059b2dae08b1fb4dc273f7997c5040f5f7c787856ae579703973b747cae4769cd1ac01f8555cd59fdb27139004844abf598b9e17c9b09a7e5c1445a769c6ecff3e8b49838e8ee5c53b089d30fe677b2c39578e8fee4bdb1fe0bbe7ebc69bd23458ed5f4e7d7e015fd6699fee6746db96f7117daecd2425d3ce2d56ae85330ba89d65bd5aa5eb88c8172ed7ba477624942f0df3fb95fd295e934f857aa16ae4e6599a7fb71f822351e299491bef1faa7e1e8888f8906c897bba50878fec7d37bf7ce4811b9b2c589ca9ff40a1675d2e0cfd [...]
+    "T1": "a397e06a2b84c4648160526abea097677a5596847d54df824bbedf92f24d1b2ff0806cedc8d987450776c92a2c79df3cf61459abb9355a0c2e970ec185bd709d908c3b0d2e2620e84e355747529ad4de81df5945544f812465891ec9499e1ff45274db51c967922635d5b4b081a0848d978b5c5958f6fe2926d97d19e2536900a9c981466b6f47313f5dd9e2f9dffde550b676874f224a87a84c3d6f864ff1e2ccfbf1a83aa886da2543ee3e31626662c49e8ccf54908d2f1d8b8af15fec965e8f502d177961dcbc024972820fd8277ebcada386022307ab8f1d200179136e6d48e9cce9ad65be3c9bb580a50ac58759a [...]
+    "T2": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac80560944f4ad2528db02dfccd1bef793d5867cf88a9cebff0927b4bd4353866dcf49d2a6e003324b222d148810fd4dea6e22fdde1e3d2b07634f7568a891fb51d16d80d31866f025dabe104416846d3c51bab196f0d494aced9b62b32e62e9e2919a483fe5a1f61a27641098189a50d0c85e5a8c1ecfd90edc496ea16c1fc372465b7af0924a69177665fe895acd788dbb0c1ba50eb9d48177a3bb95ccbf23b9969e6c4ee801fbefaf92a9cc5a7608c [...]
+  },
+  {
+    "TEST": 7,
+    "X": "a9bafa5a71f19aaf20603ab302cee8de9010e9c423a3739bf2d5e70d58063bf9",
+    "Y": "5e7b787b9907c5b357310893afd45921e298d35a1da1b77324aa40218511bf75",
+    "R": "6409887de6a73655c2a19916408b9deff2d4787097f1d6ae708b998b9ad08d664b198a36bbf77c75dd8172794b5b7bef4f20f874c0d78ddb358b706541d88885bb455724b55d2996e9daf0a5ab94022bf5eef9bd541a3b1cbc4522dc56423f331ca61518c0697e7e2cee1385fa4faed8866cf0f519fa510ae1feee17bb551a92969a88a557096037b2102a9a6d4b22c54d4c95e982c19f153d1ec92c932088318caaf72064b8d7b4cb8bd3a96433f9e58f57cb903d62a7999d09fd7ff8fb7441a7c046daecbedaddf90561e1acfd463b6048a6fe167505eec37ef5171718f2bceb5c2631c0b22a17a81f245ba1440bf6b6 [...]
+    "E": "0df56b8eb08716972a3ec27786660a07ccf944c1cc7f13a6c0f30d4d43753e5d",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000a295b7f532abdd74b70e61b16e0e30c9bcdd6acf7c00e47838509892903405330ccc7a3e22eb955d2be63df8f4a12fb8760da0c0ad5664a180428108f2fa1f9dfa072503ce8a9bc1f1fd217caf07d8e40863caf792143a3a33191a7d27461776",
+    "BETA": "96f6cc635a61972e33002940728dd6b9a78fba364166632b74d059982440ea5fba6438e79884a32d5d5987e1a4e1b4fab46189679beea96aae7247c815cb37a8f7d393c3776015cf885975295e1e58fd50adef60a662363a917d20eb34c12bf281287ca419d26cea0c630e5c63fee94e24f2dd4c9580e5b93fdb1da0e3321a61bac09de8684126c05c8cb79c2435a1e1d279231c90fb2d27443d724341aae2c96cbaa5754a5be833a2cd17d23076891976060e0ea90d296288f353b708c81e1ec488f3278f5bdee4068b727f846be378b2209eca8ac6b2a891770302b0eeadaf453721a12cddc9f10d39283f8c3103d [...]
+    "GAMMA": "1cc6e51bb4a39e27faa1dea045035162afae89dc354af8940159d7849f46daf3cbbc60472984da88589f81e746b949d7dea51b5d7266c2ab9150054337a12d22be206ab80874b26bf95a1551a59f2c8e238fddfe81809935d0edddad32794c650878dcb72538ad40afe60c0ef09872275aea21aafb9ba76bcb09f2a917d219c5e6d635a1a188324c480b8ceda5845c4f7462443b4df36040cf920028baaef56003e7534ede662ef0cb943a8b76044eadfbbda7323680ed4a678a71acb28ffc03d8036aba2dc2715169cdb0678afb67a89f5277ac56483b249e77ae4befb921f9d02e97f3317a2805d7cb135a904928 [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b18e57aede4505b3f187d53c4be5bc85223af6d7a682cab5d464d78c33afb40709cbee485b1f8a156ec2006d7b015273fc07300779e76a2a6c03ff393f9d9206d6a5419ade1d591604cccf7f8ae52bfbc3d4ad171efc9171e135f94355fcfebc9b40191867949654f446f4f21a65bddc34cd177f06863be322818e24fe0926ad410ba53a8a6167df199b04b0647ef49d [...]
+    "RHO1": "0000000000000000000000000000000000000000000000000000000000000000580490c4e12a4ca93847e49c1a06b376dc0b386087794238666393370cee6a3d75fb8965fd35240f71d4dbfd013eb94422981fc231dd80286943806f25296b0be9beaadf738f342fa4e919b315666fd9c8868df20a5b06b051915db13c6084b1feb028c7e1aa31ca9932b29a651cb1d109ea1b6b271677922c6c50f64da27614dac0c39a7b28d1ae8c9f29d7a2dce48f1dc116b15edd5b787801db05038dd78923c97a274439f0675570640d6913b112c0b25e66120d59cb3f3a22a3c6850794bc890b141a598dc229ba972560971d1 [...]
+    "SIGMA": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089acee8a2feac7895c6eccbbcf5d7875ccc95ce269174371c41d4cde5f33139fcc63d80c1549135b7255e18451c34ec856ae64ffb9c9476ea9f7f9e54e55f25570099717ee4fc221ebdc8d51ab151faa3e8364a9862d05c3d0c8379e355dfbdda6f98ca7a00d97ce59f45cf61e8065f40c3cc69e89aae548c61d91babaec816a339680671c30e462c0995b38b26b37 [...]
+    "TAU": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000446780832f702199852675cc203529fc8830cd4dbe3dc24c31df2ce9850dd5745397c5c5dc19cb904adf1d925350d7a9ec4095ed8a0bc63a435c7f96b7a0cb68ab98dc3050718532db392479262d7410c9d73f11c0aa3b1866b48a1373ea2e3f768fcfc8646afd0a4d2309400e6df3c4196f27e7c6e8df1237d137c04aeaa707a3fd55c0f7667bd6dc0d585a583ccdf4 [...]
+    "N": "b4a7dbef601ba7ae20f14597b32acd85fd30da01b91eb7fe0b6771d8e5d9b940bfcfc6c543dce407fa87f95b9a6a8138e4ff75c37c4105fc31776aed7ee6c21e5f20a1b287c97f8f7ca124709cb6ff849af3ba7ec838894b44966967c9b68e0d8ec16e4f31e0b3662c2b44d6a3172a95b9b723404a58cb433f5e5577c7efa884ab036898fa03811c6b554071a14b8d8d803596c96b58fe9b64ea311733d0adcc7b105adc7c1082d318a5f7ce4428ab4975a74326d6de6066dca877606a542d0ba8ca25625c682bdf1cff76f28f706521684eeab16171a4b71804b52c9af24ca49d1fe98859a0f1069d983fc4ef2e232b72 [...]
+    "S": "94e707fecd9c75cd4f3505c0de3f756d88632c479f6efc3e80819bcd21eff30ca1091193abf99d4963319face92d541092c2bf5fdd394363c74101177df6625922fa2f92f967243ed504237be539ca850dc6e7b6b7160e5de84e37344d0422ae5c492b410ba041589a36b723bb3a438862eec41c6a4d5562e84dce36bf83134179d967223f9d7b57bd194c25e6c2d51dd857e439f4f56d0679f0ddfa97c3de8bf7a3e2f2c0f7799d9d194b4c42f4ae21bae553a9fb1713750d4f64a4fd143f7fc370947f6c5987450a68fee92ee801cb464d20e5b2ada9fbc92a872c2f5249c1120192bb884c3ee8d2997abbaf7ff5cc91 [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000a295b7f532abdd74b70e61b16e0e30c9bcdd6acf7c00e4783850989290340533160db03614a8aeeec8a807e7c1c1f4b0e0550c80bda2d0b13e865fa0237b948918b5a60b207e1cc70326130fb0cf74b1b9beb62bb30fbbc3c82cd11837dd2eeb",
+    "S2": "0000000000000000000000000000000000000000000000000000000000000000580490c4e12a4ca93847e49c1a06b376dc0b386087794238666393370cee6a3d7fa9fbad3ee3a551b7cc93e15611ccf172820c3f4eb380fb95640e6ec6eda9c65d2d82adc9f9383fa53ed061eda9d3b1d34b24ad37134e51a9d34ed344a08ac37fff593cad92107e211180f0cdcc395a93c41011e1e754da2ffccaff4ea24937183a749c8da0a0dfd2fc669b998f0f967637f0ceef17ae11fc1c899377bb8d227876c638c0483d3afbc7077ca72e94bce0129b65e97f63ae9e5b3015ed8384f575a08dcc3d713f984b05884f20fe302d1 [...]
+    "T1": "1cc6e51bb4a39e27faa1dea045035162afae89dc354af8940159d7849f46daf3cbbc60472984da88589f81e746b949d7dea51b5d7266c2ab9150054337a12d22be206ab80874b26bf95a1551a59f2c8e238fddfe81809935d0edddad32794c650878dcb72538ad40afe60c0ef09872275aea21aafb9ba76bcb09f2a917d219c5e6d635a1a188324c480b8ceda5845c4f7462443b4df36040cf920028baaef56003e7534ede662ef0cb943a8b76044eadfbbda7323680ed4a678a71acb28ffc03dd2a43b507d08698c4f86533bb77f58d5cf9accb245ee3afb2111260b196b1db89bf02c7637c6227b283b15362b2db004 [...]
+    "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000781c475533e64d799d18f7aedadcddedd15f54c82b9999289347f9852071d0fd34d08a1ccb22afaba2549d02ee7e79d1c4fcb2fd44b8d01641e481ccd42c0649e4cfa958dc3242f5d47497d5b95eb5b06d9000df54a95cc2b885382de7ab3f8574c9ebc7b83eb30bc1ff7a867ec4596a417ff369ad75e2665b16fcfc4a569a91122e1e59093512af4cb3a0e2d2b49d86309b1412638865ba9f927768f3b84a013d45970a769c038330bf7b2070a9b020 [...]
+  },
+  {
+    "TEST": 8,
+    "X": "296ad13f39f15ef651ceff90c5c3e2e8913c6c42b498327391eebb9e7667252f",
+    "Y": "367df5131f18693a64259fdc61a3b82a4907cf9f09ee1b951cdaad935dbb1652",
+    "R": "4d4b734c2d839d2847277c58f882c356122e843d83e11c98e98436a9254e3ba298d7fd08a2bf3ef13af1a5043c13dd4cbd9232d79a1fd240f59e91e36c9ca1b84e6583477ab6db90a2bb6387d84f02f959e3585daf7ad5f0f9144763ba884f4a6f5e1fec6145cb6f3c045dcbee24631be91f61c236d32b8a01fe369364246ecb757f5db9363c6b2d218dc6c48def29dd9c985ae654828b736f643c5e2cbc77cfe6879d9830277c871a853c0c0c63364ecd6edd7cdf9aea1b4b93c5acc167ffe2bf9cb1072b0208e14a07fa0abaf2c059616a34df33e073712bcc3fd00b47b604373d42f885589c44cdb08e46acbadeb995 [...]
+    "E": "a5c068354827a216e8d7a72750cf5352d388f4800366db9a461c111badd80cf9",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000c2cfa6e4cf2e43aebe8077ae43d4569c23849baf45d23a1d5792b9e6c968c6551fc534577db0d236372efc3dbd0d748a038850a66c5d746ba8263d85e78fee1719e064e37240c2c91b04b63f1628b2c3d4e3ffd284d12da1d2288d5814030a35",
+    "BETA": "695b3fe169da86b44c7e2920a250fc71da3908266e74af4c5880665ba8c20cacb3002e4db978112ed62473f34a2d328379ad40943c87396cfe1bd18c1e55b968d2a97b2bce9bffedc067d6227e6e46c26292a26319e774a1deff12d5a9da4ac5353248c8c55b370f8231b7dfb489110256c7b47bf3296da1165673f8e7a15864290013d2e3a91819ceea3bd112fff044b026d864bd00316978c0b7de93ed793fe4165afef480975a02bf3244d3efc6650a65d669e5559e9b3b2ee3105ba800dd250f34ad7d4bab006302e74b341f9c4af542b4cf8859f394e4bd2e1c6fddc9270a960706cce163c87cfdd25e104faa7 [...]
+    "GAMMA": "0f0abaae30fae4824003601883f51b8d801c318fdc25390f61434eceab85cdef0cb68fea272caa0b2372028035725e0e4f079977a99869634f446c9e58387396e2165da2750b609754583d00e0b18f227eb51a05fa28360f6f82c44b39292b246f35cbb160c223bef95a027745fcea2f5f566fdf72b4280df073ce278f5d0b4e7aba754e0153d4bdb1e6854faee614c4105b7662f755d6202e175156bce564b534370efa404b6d480f2f5ed33e41a2c2a3a6154d3f338846f9d46fef54d10dd58198446d78f5f67ea3ac407d0c5d0e432b6994cc637ff6f86d31662a4a30c71519cc8441df029f2c9231577d6f1963 [...]
+    "RHO": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053aa65f2afa29f6e85e6566252dcc22f14aecf37713ef334b79f2c36d4715281a97fe33e87a0a277ffd5fe0c3c4eb08a125ae59e2268bf31b1d00910c92382b0ed44f343a6dbfd5a55c48232b691b20c511e1b3bc650fbbdc7cdf4d8854082b898a0f085cdbab4a13e4e145217e83df2a9da63c9bd51a01067b5d4f230a97c1e1923253bb0e58632b42a372169481ed2 [...]
+    "RHO1": "00000000000000000000000000000000000000000000000000000000000000005fd2712d8e1dc19e2390ddf1b06473c6189c515dc5d1b99b3f6f3e2c00718f6f4dff49f4bb5aee52c97e487c447c90d3ecf55958c35b4a953893f68fb1b25f08a7c6c52d881511a90bcf78bfdd1bbea5f253699c862941b7547593d07c6fe11507c6a29f885d54c69ae335502505dc701d91ab917a993d799208f8b02ce7bff5fcaa311b346fc95e0c4b353769035e486f4241ac60c18cb5090520572746a3d966a1e120a55f3bd20bfbc467ae1c913cac228bdbc8956e54f169da272566faa41387ece598f88497346146d6768762a [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443a754e75c9c4b3bbb914a9fca79bdc58fa2f556797e8b67abe130c0a002ba8252095b31a3af27e472bae98d72799d242e91c5ada4ad4068678cda7a627bb15e50d33d35225e80908d3d7a9743960acf51db4e163d24f68b1e0af7ba7e12af963ee37c1f45baf2f3fa1aeeb69e019d2912e79cbe7e55b3a8318fff757af285dab3eb72a64cb2301be3aa5b49fab19 [...]
+    "TAU": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009962e8968581203022fa41c49b5dae819eaefb3d107b328a57431d27481ac85e4697b04cae13104344fe8d5871054ac6862f6b8a3380bc00858ad7d0d623825c1f98a15bcfaec5a6cb9fde75e0a0349740a7d1ffde3654e49e5ff9061c646a54af422990721d4dc01a4e9d91ec6c1f8f22be13f2397a80ef7e88e75f69a30188a4f5cd7e70bd9df907e7bb1245b2b763 [...]
+    "N": "a8188ade446ee7342ad88bb1d1b198416ad16130b521426e6c31303adcd800c81a210472535b48d962d4c6e3297ac3b6df80da3f4cd4b8907ceeeb4c9e7154fe09bb964ff67f9e00b3e6c554110890d8dd8f8c639d2d7cd0e6b998d59217f9a0fed47c5c002abafb424de57e626898ba406c077b813d42a3488dadabf067fd82f55819402a9f3730812f0f6e095a15424f7e1df9ca2ce4521bca618cbf633be6b506ae076ff1e1ab775495a3df17ff8a8d77c97be00bcb4edf11594d83be06bb5878d4928070872b48876ba382188da44df33e9d9039ae6093220f21f0648ea968afdc193f383b23de3a184f0adb3057c2 [...]
+    "S": "77c735833b4bd2fc7eb65ed55013dc51b0c4a82ec60dd6dd409808d4cd28bf1771c6b00319b3f055d7be8f3197ab5958130cb40e529ad7fa870cd3f47eb06c44fc7d2b36df7f8c97d5671ee3380e9a54505de81e8c5e2b186fe5361f060c74e34882cb087ccd3da215707dcbc4192626bc9d54c17620ce8714b5bcc64032013f30c5cfa53951f5a5992222d23eee358f1cda0cd5b4dcc421d22abd540d0ae1e8dfa24528991ef59c374c3ec833f2c140536efb88af899371970b289510aac9862771e35d7e1a8af805821f234142de9da5d406fe7eac3a7fc6d7496d613ce001d83fc5a65b2133d609f2fca758f99a05d3 [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000c2cfa6e4cf2e43aebe8077ae43d4569c23849baf45d23a1d5792b9e6c968c6553a962e2e31404f6c3664e2674b9aecd089bbe524dda1e8919355af3900df2ea3f26ab06a922b8298096778dbdc79f6a841a1169ee7472b66995d1e2336bc68ec",
+    "S2": "00000000000000000000000000000000000000000000000000000000000000005fd2712d8e1dc19e2390ddf1b06473c6189c515dc5d1b99b3f6f3e2c00718f6f842aff853fd90c4020bfceefa9a462ac51c52eab096b5df4fa4224a482d59398a8e06e9a89b55eca07911152b3518eaf9cfdd1e23e07e7881546fd3153c160b547531d4384fe1ba99d21235d1cac880662989ccfa75b964507780b098f388daa106838cd60cce33123d59dd60b57af0d778473d40ce0385bc7bc1eb7ccb0d2748b9bfa58575fcff0bc96cf3512450c7cf9952ae7333db772000b9e821657489680dc7d1014a1aae46b416411f8e2de163 [...]
+    "T1": "0f0abaae30fae4824003601883f51b8d801c318fdc25390f61434eceab85cdef0cb68fea272caa0b2372028035725e0e4f079977a99869634f446c9e58387396e2165da2750b609754583d00e0b18f227eb51a05fa28360f6f82c44b39292b246f35cbb160c223bef95a027745fcea2f5f566fdf72b4280df073ce278f5d0b4e7aba754e0153d4bdb1e6854faee614c4105b7662f755d6202e175156bce564b534370efa404b6d480f2f5ed33e41a2c2a3a6154d3f338846f9d46fef54d10dd5a4e068091d5762d5d8f2ef9d4490ce5c968294d817d904a3f7f86b7f220f7a89bf9544b7e2f9264707243df1bf193d26b [...]
+    "T2": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c2cf5397fc08d4cc2deb2e5aba580e2931456a006fd4ba384453a056352a816ce8916911e1547a73a78bb93de02c4cce6be39d3e300e12d0583b256dfaeac6db3bbe4e760a479010a7a4a9f2d4c8b7dec2c37e6208a9c7c6766ab5afb06bd76408e31c7ace4f7361fa877c8d3a7efffece6bbeb05ed141b1041ca3fc8d83ff5ee3b695a868236b8bb7a7d6ee8bd97865ff0be63057133736e883a340b4ef1c8b90f53fe1860e3a5a79c7dde736d85707 [...]
+  },
+  {
+    "TEST": 9,
+    "X": "1d34144c512a257d5e22baac78ab92787e7e5c3d9314fd3a2774da9347b3099b",
+    "Y": "9ecb232b05dac037aa8f0e8039d208abcce832f9759d4e37f8bb97bf6e1b5954",
+    "R": "037036c7472947bc291b8f16d26c92b6b937d99d80ffe186c6111146b3a862e3c5af7b073b0ea9859ad660f5ce306f92587f2208c96e70ec0d5fd5248dcd1a08667db19ddb6bef8e4e102cbcafbf1b386157be663635cd9a93147333aaacab4190565380cced2f19a3af5a4132883cc8f2868862f9653414bf60f1d9a80053eba1961db02e1099acc375800e44039593f946405550f59022193e44aed6b03f48cbc30ab912e564b36e70bb56b03fac7d7c7680955667bbd43ba56ed5b06644cd2d2736904438bbc56a7fd14f0964ebfed95f92e4ea5e2ce8bb8f9677562e80ea4016cb4f8371e98b75b68ff50d66b180c5 [...]
+    "E": "dad551c3465cc95bb1abba5bce2e669a5a4455b1d3464d321303cd46500468be",
+    "ALPHA": "0000000000000000000000000000000000000000000000000000000000000000773589dfd2d9efdd66c77a75c75807cf8d6f90b5cf0567c861459406d175ae5dc896fbf74c38fb8a5be8511c32724d338a50396a8e99a50b8552911c135c43c4c54674244612ccdb9892665222ee773deb11ea12cf80a6dd203f6224cbd3c11c",
+    "BETA": "1a3f88ca0b8181f0d492773b32efc2314f7c9f86a482d212c0cacc5af38d1e97e012f9cee0b58240e0ced1c057217975b4232033e123ebfb93e97bf690f9d285a035026b4a7c4a7462f9670be2e478f92d3d37f6b799af150a65a1621c581d249e6ca1d5e13ea06ed2404e0cb82ea83b0277d685fab03904b4993881c570b0181d63e8f6b9b07f39724ed8db20e3d0c6dcaf703af0702da94e085bdd43b647c0efdab38df31fa34085eafeac99c91196cfeee3297b669ad119571adbeb15a60c53fc7f1d9d066eaeeb877b73645a1f8d6a5a0812c94f4e07978dd0817e30458c62be2929ae7eed3e4617786bcd6b1bd [...]
+    "GAMMA": "2ca82078e6fd06899a22acbfee5b5ba31555b2284033d4f0b7c8861104b2995b6bcaf9a4271bdd11136d10dbed974d3d1b0dc05e816753c2bdae41982297216354bae47ea2c16652ac0704cf1a00a2ecc6647490af1cb2d562bd2e0b2262d7b3f4e75c41dfa52fc3deef19dae8c7ad650e83598808424094bf7dad8e59a06e1d8c41f0ee3576fac6221bf33f4ecd297d77eb1017e95d44d02ab24c6ca1118cc50156a3c532861abae39e1c975c83e731c9ffad379079fa53a26a6b65699040959ac38fe0ed13c4e04a40d303e2ea00ca2c559c38c96e0291e2d9d561e8a796db323b768088e1b26e531df78a6d8774 [...]
+    "RHO": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4af896e50ba5b6b2bc54db648e927482e25ae25db1d98764d810e9257b9ff5a0f4447354cf397a64c704934ec80b8f4f77db67c1d824f9d994c096799a82e22b26d5c36a4a98f4b56c5d5a2c85a23f0a6bba3380662ae302aaafeccb9a0c3b5ed583082f51d0da3aa3f82bdae3b8e5236e57e46e5126f786c08ec409a99382ec8ac7f410d9844eaf1b04d6d58b5b9c2 [...]
+    "RHO1": "000000000000000000000000000000000000000000000000000000000000000071710be703a1611f3de31ac7fbe4aae602a979058fafb0b6e1faace6500ea851acbc4fc6819a68bfd6a385809fb4adbef6fdc131d187f5a220dc6c5cc5538545d5b185148fbb811622dcc5366bc5457a36cdcce838d8ebe73fe080f2791d0b65e0a72148f2229fcfc1406f1af962efcd5de189b46ddd2c4a4d40f0133f9d0dd955515a2a6e7dbda20bcd75a6eb50138928859fb696ee226873ee2269a3bbb83226c43245e5dbb0a6646d99733b803ebbd412c19a63f51f8c4c57c753a6fbbcfdac7dfbaea594078e929c750d76c19ca [...]
+    "SIGMA": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8f3d7c72bac30dc5c3860aec2f5f0d2a185d14a2bd32dcb1ab6903f200fbd7ff5e48d7249cce77a0efbb7207a64623d456e802fa924f49a63142d75e8920ae2f6b4f31c2d3a60f77e7a4dff47ea954c5289af5a580aad5d3e5d3a15e0813f1c8d6fce5188c02dddcf01983a43153a78268805d1eaf1e151329f6177a5b1aec1cd71f7db4b3f9a0789542739f18e3c [...]
+    "TAU": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038f6412d71ee9f0fc03a456f31f7edf5b06e8a7ea059e8cbc82be6761582bcce071f4fed057f04e5c7ea07507aaa389d16f6b3b839fc22cde4beb24d4b8f5b89e4392dfa00e7ff9dd7b91ca5a365e87b3dad74348cd5f1379f8858868c2fc1c7801377043819d429252cb2f2c898517bc28a4cafe64db37f5ead7b665179c22f71f93f0f5f622a07b96416e2a2b91767 [...]
+    "N": "9ecce4d1679cdea5c74744af5533ddef2c16ec159542b49954cff6cee8b8520423da22808380e8d691eddb2c65646f194395c2c4f72703e2c91c16ac147cad7f1e1c07618a5116c9f7cf3e546e13bfca8bd2e5559d1ca6886f05710667021fa1c226142a5a38ec8df884ebc27bef50cedcd02ce1c059f55351ba032d9e83df7a4774576d410f89cff8263bb3a381184c2a803a2124b6e30d64dfb2f6b932c7a2aa65fa896c9d8dbb9a340528c5933720c8c9a93515f282c3bfa3bbd7cd9ad448cb1108eb2c913bc4092716d5fa91e4eb297141431eeea12c6b32de17c0b1544177ebe31b5377d67164bd790c424798f720 [...]
+    "S": "1298c2d6e85e909d3f81107bf8379a609d633f39a9e0b2718f9fd85cd0984b0eb264e6c0db14050d6441d713eeed8416c92c5ba33877399d03a801516c931b3dd2a2b1521ca1b9399b827e7f2d5c5266b697b2ffe8150db8757da1e80a670883bfb3f1b65f6e20c167176210ac492974180c6c35e2fc09cae3557dcfc6393bfc82cb478ac942dcf05d9512074e72d07ee461881ef89532a91c066d242b01009f5656b266868cf78ddff3e60518484e4ed250420791d747f0a60507b717a620e537ea56e0897b9924126055b5b25f743e6f2fe2c71a20c90b08b49144a2a946dc21ca8c4eee4a0798e786285ae527d4b5ca [...]
+    "S1": "0000000000000000000000000000000000000000000000000000000000000000773589dfd2d9efdd66c77a75c75807cf8d6f90b5cf0567c861459406d175ae5de18daae8edf4d694fbaedd95694fe0ceceff59a0ef3c47790b0410e8d103b7a672d7815cd4a78f3ab9b11371d10100a933767572b876aef4e9f141c35507da26",
+    "S2": "000000000000000000000000000000000000000000000000000000000000000071710be703a1611f3de31ac7fbe4aae602a979058fafb0b6e1faace6500ea85239830574f4978c6bfc46c70d1f3bf56aa0b07b112913708522f42b6313b86b75dc4c0bf501f5ca25417ba0eab7cbd0fc235d27f6df4f53c8d99095b3411e7dffd4a0b87743a169e37834971072f7f9c1866f02d5fa5b9a261904725c23ffa6ae837d716e548dc5c6910363f4768af62f29163b9edb022d773ef5c5095e74b3dd58555d16a2a3033c804f426794082574a2a802a9fbcf00f16067206b1a4a492a29870732c4b9aca212d0b69b796c5156a [...]
+    "T1": "2ca82078e6fd06899a22acbfee5b5ba31555b2284033d4f0b7c8861104b2995b6bcaf9a4271bdd11136d10dbed974d3d1b0dc05e816753c2bdae41982297216354bae47ea2c16652ac0704cf1a00a2ecc6647490af1cb2d562bd2e0b2262d7b3f4e75c41dfa52fc3deef19dae8c7ad650e83598808424094bf7dad8e59a06e1d8c41f0ee3576fac6221bf33f4ecd297d77eb1017e95d44d02ab24c6ca1118cc50156a3c532861abae39e1c975c83e731c9ffad379079fa53a26a6b65699040962280dd8f395d6bb61258c16c3c2830fbedcca051e07d841e566cc017b3e054cdd2eaacff1e93d84e07c6907c06f77dfee [...]
+    "T2": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000906c6e982b5b42ee075f78a97ab50271553ac60b0329627808df88dfea87ca40bfaca4abf8358f0402fe276892d3b795721aae563f5a0237c7ef053d07bd517c06dc4c672a7ad211301edbabc9f2116cdeedc2b3eba1f7206eaebedd6e72c04e0cc86c7331056e01588973c698888b06dcb96faea0576c908f063f2bd74d7689a12b52b157bb4fc032d241abf74c42005c035d6bb4a16d35e96be041ed2b0b74eee719d66a847bfe65215adc714efca6b [...]
+  }
+]
\ No newline at end of file
diff --git a/testVectors/bit_commitment/muladd_prove.txt b/testVectors/bit_commitment/muladd_prove.txt
new file mode 100644
index 0000000..e56e111
--- /dev/null
+++ b/testVectors/bit_commitment/muladd_prove.txt
@@ -0,0 +1,190 @@
+TEST = 0,
+X = 801f4dea68b9ba54d54ea37eb3f8d7bf879faac2bbd49056c814555543b1c44b,
+Y = f307848f2ec6727d602e78c12dc9a48b6a8aef05d343fa8cca2efd20c8ea26e9,
+R = 318ddbf164addeb9a7769b75442f32737156f377a77409e7afed770ce57be8865c3723a9c71d65df451f8a9e468e8d74b012d745104a22c872e073bc5eee41fc8c0d7c80a8800734d15c518d396fdafafc72daccd3de1ac99291730ec736af67c2c314a3638f610f4d96457d89040e00670d4282218dfd3b60fa48474de0d16fa1fc1ebca49206b9beef71b3234bd29038c2dbe2c464adc40dcd171e9e1f1b5e2fcbfb65e558e3b96e5684935103dffa0a79cabfbf7034e712202ef83435565dae742a0caa84533c8495593dec7966a7fb6d6eaae6e0637e36b65975539cbf51538ef8c853e2187829a346d88a0c93f9507bbebc [...]
+E = cf2605e685b3ad55c2791c55e43ed26ecefe438c4475f53ea8a059610b0de15f,
+ALPHA = 00000000000000000000000000000000000000000000000000000000000000004c877071e8b11903d6d99fa3c2b6e2f2283ec9fa8e728e45e0385f678626f28e0e3745037ce4af054385070d524a435bb8f5c710f70baf04bcc021c699937d9f324af45a81ea3fde62cad060bab45cc7578dddcef96948e1295578e9ae264557,
+BETA = 8c8089d33df10763fdef52bb5fdf58ebac57e25cdae7125fa00ebfa0794649ddfd02a0ba96aafd7fc864718ba163bee9b09e18bdccaf7911551ccc9a3c00b4ccb0d3de927d5b7a9ee3db779c46aa1ed7806a12fd8daa817f3c0926354a5b90e5e6bf2a153ae2010711cc69929af80bd13ec529ee1ec56103de5560aea3c1329eeb69fa1c83cfd4018dbb4d23057f4850f9e72d5775dcae88533d8ad15141a49196d0b3b60c8e0e845bc1ec51d9ffe37fcd50804ce1f30c2d14f2e77604f3c4dc21ed022172b4552207d95db5c60b65208ea376efd887818564a01f3277d1b89a00df6e26ea20688843fc393406d331b926ff5 [...]
+GAMMA = 87fb0885a31f9141df1f08679619098f36673beea3833b2e32c46772b124892538fa3e04cf1a161d783a0d99a8053a9d4335ef9ca1bf9150e670d370aa8e9100753c7ef75ec62911ba3536a472a1d36a086ccd84c2b95bc7ea2994c69b83f32130a6e70e994a5b58198f3facf1fbf9a57672720da38fde474ecf69a5a31166ac60c94072b3deb3a95f1fd41efcf92f0e05b3d77775df3e0473a00003d142cff18e3a30fa586d45de22c1de3044aa223b203d39b649f816c57142a525329da3a5c0235fdf472f5c585249d211e0eb7f83fe99c57f130319a337a1381ce6b89161649d5799f4459fb2c041f6ade80c67f1fd41 [...]
+RHO = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ef74133b66df5fa21d7affef86083c2ac0b0e9ad57d4445f417ab5c56747979aa5e824a80f0fb89579732c4056f0404a2c0d8e1f9c6b331a7541151921f5c5c900121709d5879959537cf55e32d3ea88149b2ab722b015911c387e0414b4bec8066411bea101c895b1209b63df9276e5e931db79a330e40566c829b3f4ef547c630cc3724d04a9319ce810d64c8f22bd7e7e [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000002b847674548d1361e2f69d4ef1332491a5f095a56da0dae0dc0e111c63a8779d877318fb7056734e9fd49d4f12b2b741c636640c16cb3101ce156096fc485c5488876df293056b6251ec9cf3878379a2cd940dac866ceb456b6b52d6f74cc14585330420a01669b10ab1ecbe81f216640967b833c142faf65ec2a14997604c3b3a99ca407a5d215fe4a39bc7a32c7529a24962fbebf5dc0710a126e56d53f10447dbbb93a992a87cb1196ca6758087a7f74aec96b35aa654df61661b141d8574b437813b6292a36e97d70fc1feaf153f6a67d [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0e61d9b8bb4dc782bb142768802daf28fea7e10b40724e7a42ff0c99c3ff1b6f6f8a13bad858774a823734d322fdf561a64d655e589e259201d3af59a68d03a4f210f766e204dcbaec2c748bdd77d550f5b450b4696316432983f12f2238452ef89e9a2ee8cf5ef868068f10555ae4365663534ceae79295bb30243609bce2bf5ad521cae8fd060bd79417bfa9aad5d05d [...]
+TAU = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e40a132599ddd90cefa01b80bc0509505e8b56d5f3a3c9bf93e52665f506f0c79ba38897d6f81d9e2c76621a7b7f2106ecd1d955b458dcc4f30e06d05bf921637dc7734b6b287a5d72ef3bc687198d254ddd532c72349bd2d3ce6e06b4a09d7e70a95ffc07536f936b987edc2dc817cc19f93b67545959111a97f14d7f92533d7880adcfcbe52da9b6e7bcaf5cfcca42bb0e [...]
+N = b093df5f2c15cab5f6f7ff96d10de609c6eef7096db944569ae0e76ac11f773157653b88a91247d84195438b9ff4a84c91097dcbc39162e8db9f8e820e758c361d2c7a48d57401cd85a85e9806659eda81a5249eb2b498915470f23e40b87a2125de0aae4bba4d5ab111dc942fbd9f4ee1a3a0cef44863b2b1686305c442c4f935e8458c52de9e9d3709e33678ffd45777095b5e8e81d65aadc2d3087719176739bdba3972c23b1a38650d15313959f18f66f0a1e4c0359420c1200f90091bce3451c6f8f6dc94e748238ebefb132b6f4981c1605ab4b18a4db84249530a9a78472cbd4938d0544eaa9c1c3e958e027affc0a2b4 [...]
+S = 9a7865c5aad3877e8934f08b7569182b803f0ddc9f70a30fc9e7e8be6431edc4927bcfd3d4a5b97e96fa4592ed415282bc479d91983d0cbca2d05979098dee39706be0f05b17b1d57e085ad91e1d8255de3d11f00092a3d409e7f222cd7914aeb35d95eb65a0893bf388c23600dab09f476b498a25b533a5cf6377bcd908bfae7a87934375a8e773c3b82354ece2cdb2f23074eaa74cfe527a61ed6aa800eaa2450e410b3aebeb5379adc125fd3b0640f8871d291884d89221b6ebd52ce225fa84eba0813dfcc1f982330c2d7c73618ad59c4398758ecf71bf54967ac302b2b2980d3b58cce99502bd8e1e5e487607ec31d4c9bf [...]
+S1 = 00000000000000000000000000000000000000000000000000000000000000004c877071e8b11903d6d99fa3c2b6e2f2283ec9fa8e728e45e0385f678626f28e75e39c9d93ee2d0592c8ac9abd7ed4e881532c091a7c5206a66b0447a69616dd8ceb5b13436fa97c4092d2140894b7867ea7b723e26e6a8fa1979aee3b73082c,
+S2 = 00000000000000000000000000000000000000000000000000000000000000002b847674548d1361e2f69d4ef1332491a5f095a56da0dae0dc0e111c63a8779daf0bfc82f62edc80da54334baa6491a20e7a91cf0b93cb161c594404f7cc7a2b3e9316de3683cf843d13a8991ad09114767389d3a6c2df280dac81d3c1e4e244d8c461f1f16abfd27c15fc7084a30e897a64e72545ecd8d580cece0c39a7bae5508f81e15c8ffb81195e783e133fee397458d0a278f7634b42406dc6b39fd94cf29cb83b395c745de46f5cf819b95ed4f5892dfd2b787eda06c8a5670d087a10fc3679378c5b680567504f6202d583fae0cdbe0 [...]
+T1 = 87fb0885a31f9141df1f08679619098f36673beea3833b2e32c46772b124892538fa3e04cf1a161d783a0d99a8053a9d4335ef9ca1bf9150e670d370aa8e9100753c7ef75ec62911ba3536a472a1d36a086ccd84c2b95bc7ea2994c69b83f32130a6e70e994a5b58198f3facf1fbf9a57672720da38fde474ecf69a5a31166ac60c94072b3deb3a95f1fd41efcf92f0e05b3d77775df3e0473a00003d142cff18e3a30fa586d45de22c1de3044aa223b203d39b649f816c57142a525329da3a684ca8cc6b888239c2a503c6dad6c3eacb61738174989410e878e9b697c9b2821d819401b1ef6db3e7a3bc08b3a958ec84833e60 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002475524b6d0e224fd775c44ed88ab5eae2fc2ea480267c0e911cc45678e91f6673c63c402b0397994ba6133d7dc65c3df239a83f990debf619e14239da3652dabd9bb9936fa272939da86cb3643341b69222ea3a1797591a8c08aaf20ca2e0301dbd87bdd8a956507c0e5b54f080613dd612559ff1ae5bc49db63787a9e0f0d19bb1b61a6c1e20ba705735715a9d099bfddfedc5f53db9332422a75e312b143145b4b6d484dab3f9edf210eb65bd4a2e7cfdb3b [...]
+
+TEST = 1,
+X = 00c8ffa313b7a42c28a9aa23511300915c09de5b1d7c94034b8f222db54bcbd1,
+Y = aa78bee1654cf32df233ed4a2cf6e41481f4683a852d73370519c6aca2bac9aa,
+R = 46c47ad73bafe437ffe0b1261f5b261430389eff49aaf326c41ef565d5153cf253c530d166281c3508d094447db1a1b88a6d3b6df46765a9584bbb65cecef592581ceeab50db56326eaa01a6a7a6970cdbfa373114e6c54a43e8d9bb01ffce42fa9849ff2bae9447ecd8941aec4ef096e3302b0e3c6f61c2058fa83e63423115125828207ae2fd56cb168195f0f77a00f5a8a4a26699ea733a3f76801e773dd54b362a0a8fd1b12dad39e660c4d23f9f83dcb2f4b17fe6e8af1d65c2eda5c42963bb8a31c90a26ca77819e52284f91c6cd56558a4ca574cc5f6c9c6fd3897b4f39b0fddb96d1dd32bc1fd2b8a84c80b28d8a9c1b [...]
+E = a1bf317afeb08a155a51c60ce9bd085370d835e107c30a4964bdd4011f908071,
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000b808313d49f13b55661a3198a6ce355762e06af033b5d5ee83a43d7a01e15eca89d6e2409aef39813bc0db6564a1bf871e45d769df93dcf3288e7e30ca0690945e08ed234ae8e6752bcfab43d02a924655be08b4ffcfc657a1d3f850628d9d2d,
+BETA = 89479133b939c970179a6c493e359b665fbd9c3234ca1c362550f785f6cc868471e7069c6e941069d06b6eca24d458babf911a555d6e49ee3f2bca488cf18a08ffa54d048a2663c55a60a5ab339940090b29e7ee0183b89a93eafc006abe532e6e11c5072d1459776134e4d969fe547db189f762c5960362f6d5aaa99aeb38110922a75fc53827495b1cc3a8254226ac290ac6f68e745f9a37b1037976ff6cdbb4bc06289d0e23c45b0ae0baa5de61633dc4817c087ea7910d71fd45413e1fa933a8fd0411cf0dc86dea1909f3a1f1ba4731c91559197681452a87ac29737b9295fcccdb47bc9a630f3a9c404a6655bf5c291 [...]
+GAMMA = 97c3d0a71902be9043e7a5cd8211534ca221f86d0846f269e9a3b1b831def9b4db282f143104addcbdfa7cf1c093d9614a0254f31d1730f53b73b335651c0c345a849deb7a09bba9cd4a771185c4ce6e792fde11db32393909bb43318a9fb26ea0a6dcf0afd8680d0df63d935610e61a18f6d2d598619879a3b13230fc577d7a5275e539a54eea2f6fd95673dd72d908eac4f527215086b5ee66bdc0f0fcfcd71b0c2874168de5447928543c095860fc8c50d9d9b2496c3da69c89b654d5f581fd1e1a8203f774db7da0cfe1bfdb15602b7127fe0214ab1cdef5e01a7ec80c1856a664b2209fc397d129563deec88014c631 [...]
+RHO = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000834c2c17099b3c5c9cb24fd8c621c3fcec7f28ad68b2f43f8be4087123c79d811321b20a2838fc0b7d647373560984ea3973b236011060dadc4bd150afea13634f4fc03d169f27606e77e2ad212a8239e128d2f2817530034f8bc5de790d6627de2e57bad38b8f7962b963c7d32a4c26076b5060e8a8b0da8f6e55e19b5ae543b59eab13e87c5a75442e1f8cdb80b7ac4930b1 [...]
+RHO1 = 0000000000000000000000000000000000000000000000000000000000000000bbe7393a3d7307f3c13fe278bdfe9abc5fb0415ac9af476e75cf91a70ae9af50b9a22d7b836155506dc44ea9c118b67cce41d4116156e04cc9629edd5da4977ba73bf8720adf8ee1911fdc0dfc25ce45b82ef98a346166397a0c1c0f940b3a1984b90776c6fe622efd784f151a730e1128a708e415830e2c766bf386109fb8dccc3a1fe0a708eca77a7d455dfef8a150656c19e014d7ddbe02d4aa20da851e3e51689c50ad6b1deb26dd8cd3835f95eff6ecd43fbfdf936dfbf0db7fb4bb6caf94cea5137f8e9e960614cd17e94cc0330edec [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d8a96f36d6ddab3ca37986050d9c6ad6757d954eb7537f26d5bc81e51ae1c86c2ee7510fb9879dc689d045d88172d0d6309cb92ab15474d9bb992072bc0ce95864a0f2dbc4e34f614446b281ee03f8031627e05e05770226b9d8f2c376c922fbab3ff41ae9d6fdd38a8975e87af9f7bf3d7a4c8e94218cb99f2d8ebab2f6186ddb27d98155ff0b4be2bd586cc0d5f9c5af4 [...]
+TAU = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f3db1531a19a33e53c1dcb68cc94de61442909489ea8e795980573f772fd3e8a34b01d264fe03a7beb1982a7031049d2ceb6f702d19ec99484147f9c417b8ff7de7d13387dbd882fc38937ad676249d82735daeb445acaa1a0a5ff68f89fff42464e90ddd8bf38af8e031f3717695cb7550935eb88144d8584651cc710201d7201ff49537fc3d4185c66f44e32b50788c7ab [...]
+N = a30a908a793b651d2ac25a68b95530b6ae788a8221df672a695ab955c4537abef256968a68d5d3ac711c5e24c103abd5aeb8bc8464173a55c9851a3b1cc2e79d141f5a10d5ba24701ee95589bdcbfe3c40a3806edcb5b9a1a8861430ac2cf70abcf8f7e63063abb8e1a9165b3c0368e73838ec2d4413e5502c1139a7116b47261f01c931b34f0b57494cea66e91e7df1636d03cdfcb2001cfc33388bcb7141e7dd913bd73c1968e703c71193c194b732c4fdeb9757f5836019cdcec08d759d6da821cd35b9eadd255e28b4d6e840744a0ba9fb3fe492096f8464648fa8d1851ab6a8643b8f29e343427c3524034c48bab4c71091 [...]
+S = 828b7163074ade4570feea08fc15f3667ad5f563bcc1ffd112cd2a4f55b41c154686afb36acef6bc7124ccec53ed7284cc08a224d2ddc7c7e38324ca0f5ebd6ed368290394ae399f7764682089c11ddc53db4522c60eb42359035bf822d9a076a059e5b3c806aae3383e8755ef13db6654983107be1cc4cd0a5a12fd316b423f4269f49528808ff442496c1777e665dddf72849d67c4b8f1befa3655cc71f4860f177988f8642af1dc1c828c4b33edb61d915ef407b1b4a844dc37a2169afed4bcd4e791135242e8b633d2687aefd0847e1050a452395422a302c8e8d4589be6f9d628c66162135a5ee0f5bcc097a71b9bbcb5e5 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000b808313d49f13b55661a3198a6ce355762e06af033b5d5ee83a43d7a01e15eca8a55e123be81708202762509680c073629d309d795d147932b7c1f92cadcef9300721c5656a071e69b800a29239945f1b6308564800350b6e724f145437b146e,
+S2 = 0000000000000000000000000000000000000000000000000000000000000000bbe7393a3d7307f3c13fe278bdfe9abc5fb0415ac9af476e75cf91a70ae9af510c97246b8ef9abd92ea73be7e8549e87cca4851dfe2b5a7aead5edbefbdf75820561ac8f1e1b558fe731f6006c1c5415032a0a5b2c80625cdf34c5e6c8d47ca5d236ecc8a78c3f75e1679bca58c6f802144ad5ca9b89729d748aa4235cf43af18da640e374056599c1db776bf9d60187d763590b3d0d3928c06c23c6c6c169ef0d685d691c05baf95d883536a66a846b57f78e96174462eec16ad69c848f7298e59a022efa7900e54fe4b9c553824623bf612b7 [...]
+T1 = 97c3d0a71902be9043e7a5cd8211534ca221f86d0846f269e9a3b1b831def9b4db282f143104addcbdfa7cf1c093d9614a0254f31d1730f53b73b335651c0c345a849deb7a09bba9cd4a771185c4ce6e792fde11db32393909bb43318a9fb26ea0a6dcf0afd8680d0df63d935610e61a18f6d2d598619879a3b13230fc577d7a5275e539a54eea2f6fd95673dd72d908eac4f527215086b5ee66bdc0f0fcfcd71b0c2874168de5447928543c095860fc8c50d9d9b2496c3da69c89b654d5f58268d35b973284e65cffdcea95fdd0179e47cf26e3019fb6ce6ac43aed4a9619cd3000bdc9b91d8f4473ba7707ed17bd9c81db183 [...]
+T2 = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030fe12527f863e55e68ecd14a70e5ee47cbe95c291e3bb12427a6bb614b3875f3c8bcd7bd525d6bab3b1c3873858e41dffa2ac81b5f254c39c1d3f048cbb34b0ed0d06a068ae3384382902996df68ebc0f63085b044c5c36e0492d4c30be61a305bc4b542446e82f997dd45ba9c4b32ba6caa133cf3f732622556035ccf27d6fd408a488a8af98e0eb6c881159b03f020c8e003ac8300884577578aea2b0cc77cdb44daccb474388c2b876f7c80c248b5bacab5 [...]
+
+TEST = 2,
+X = f4ddfd94405ed54ce18c6b5608e6eec038669464604e30ff1e0e288813250aee,
+Y = a524dd3627e860d685304ab20582678746053286890ac6d77e2a2df816abf0cc,
+R = 54686acdc3c54736126e087f967a9dcb85b01d794604fd35b411801f62d3c87c3205d701db804b00866fc84e64f22b74fa8e42abbdea1d6234e3c10c60c402d327a6471cbca9c3c759ad133cc0204c78b80680add0fb3a42ad768a3c411d5d8d0ca178d59772b3427aa5d2e00eafa23e8cb2c25e26bde70e009c83093014fef82cc494360cd2000774e27b004c4876af15d0fb21da30380c66882bce9abf9ab7cae6c942bc3e8827674e600cc63642f5e0cad5b0d7966dc5b9f2454fef27bb8a3678d607d50758f896b80591044452e3ee492760c9d09cd82dc12f025935587b504506ea3cce9be7ec0e1fb9bb9e126b7accbeb4 [...]
+E = c63529ab6f893732fe678edea9a192230130a3e2a55111fc8ada52f58b4c282f,
+ALPHA = 000000000000000000000000000000000000000000000000000000000000000089a4164bb493f26848e87530b0c0892394d09ccc4b006e83d48a7fa851d655a62eeb556ab2e1de499f0af0c8a4e208fd342ba1d85f4e69c203e28d83640d41748b006db25ff18f6a0ed6ea0794fb14cf6868ed04bcd2fe8b315ed25e24e10c34,
+BETA = 335f6f9594d72b91a3bbf8a10d081e8085efd8ba376a158619b33b06fb77f11e1e8f01b71ee52b9672553314b9d927c6cc3c56f0ba0d9f3e2c4bc346dad46f10ffa2031638a8d349f10e319dcdc2bce50f3f8302cd7de70da4dd95c3126cd853e9b2b3b0081a2d079f8b59b558922081566c4994ee5a850d3999e9f7eb79a2d9c1127faaa9df412e1eb4088b99105e11118d6cc4ca538a2cab2501af4c5e7ea0b14e2af10c2c52c241c19619b388eca1e981facf92f67b6b23644bd08af98a079c896ba0a6137e13cd9dbe41cad87ecb0a97abd7dcce5d866c88bf1ad3332594cbc1bfd402a353bf80f271d9033edbd579ff2 [...]
+GAMMA = 37d71b3c02d502304e99bfb6bfbb6ca92434926dfd5983d5d7701c303788a146f3ed1138746ce77cefc60c064501eed1e29648fddefd7231709e04852a51b4ef77c2007642ff4640d3aba1be68c9c91fd2f059b7aae5dfa3ab7ccf0b2d9ce47e75a1d8d317436787935ba316a00a8de961fbb01e119e8e65bbab6a5247b37b0e9102774bf8aaa5b61f43d12c6f4c8d9bf6a7f155dd8773aba682a95e55f4ef5e5abc774e1ffec0a03de7d97d5f9c2db5ea11c5af7b9f2d93bdd2ddc9d34cdf20d18d71686d1c05274c929ab629780fdd7192636adde8fdab93cf0b890d6b4d75653fdff6ffe5181ac12d7001937809d50448 [...]
+RHO = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afdd92dcd556fd629a07c1e919b81c4f1623511fc753f47154b25973f33b5331c9fc1ab3775c5febcd46ce60488b947d9fade7af7819082412a10375cb3d6b127208dabd7182c4c3a935bd76dc2d0a5ffc2ced03ab5410d5d321204c126262c7e424ebb7357c9198ffc52f0bf2f73abc0bfea2dcca10247fff9dd3f637554fd92ec1814cf98d86dce0a1afb34853db05438887 [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000002752c45f3be0201f956d7e26fd4036d290a078ac14b8da032b29e3e0b24ed258195a9734eea4f84d8a2165e4dccca03e886bff76bc8e7ee8ad5eacc9bada7dbf013d48dc13ea4519f7aca432dccc21d0e223253a3eb580833666b1c51786c6930d2ed582f5286b4bc7d8ed4160800aec79bb09f5f53610582c43b0c2353eb269d8f5bb3a9141b89148c750a7faf5459d40d7ae3d4db547f1dbd6c2b921300d76c1d9a664142e73b97bdcdaa22600cc030e28b9cb6f7e3b183846e66a1843ed66149f5e04ed5c515a695da41d4e90c2f0e061f [...]
+SIGMA = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9585a139a254821afc4b439aa0325d969f6dbd3a645b7bc5f23a89979b429e34c1de92da45acfdfd93f19b7ea479b80fbbe300c49f646c23bc278fc4715066dd594852e2b490f74a37058e9c86014371b897eb806039aafde4f44823d2de5ce275f9f451b69d076c24799673ee33a9e2e93fb8c262c7c9efc8053af50d9e4c655a7e7dc232c6894fbac617e3f96bc78789 [...]
+TAU = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab5e21d51357ddb5256ba529dd88fac6a06154f947c4d99c8802c4751ccb5dea8db3a081816cc622cc9c2fcd9fc9ce0ca8e31dfca1226aaa846fdf8559067f9681da62564aac71542c895d2bcb3146d851bef45c8defd978f86829ac14fe2ea63c90f2a04e1dd358154cf2d43e5f97023fe7a40f1e9d3a1e961ed34f2cfb7bbad843eb1627719fa031b621288baa3217ef3064 [...]
+N = 96cbdb333a8ff518fd3488233010b6670fb4935da833cab78a923c6e5f83b0d226a698dd41e167fb7860e04009b01563bde0e349e8f76f377dd6c6b1a383c4c19e896c019eafd8da3f2fcd57c94a331bdedef7297cac0904f5c08f44a0f503b89196463f4507cb1c29cf086af620b3a43766716bf8797e0fb9561b1de58e0129fee6b028348fd5d8f9b707a23346b6b11316cd1b44b9a18b2be015c9b272be7e01df46f18a9eebcfb3f67f60c76dd39cdc627ad86e622d7b7078412481642a72a0b52daebae3d13c00ed7c75d4d1187ebb8c3767671561dfdab90b74ebc16639fcaf97be5dc0b8d8ffa29a8731db673a66d5dfd5 [...]
+S = 10fe4908ac7f776875f4f49cf7a52f18b956b50c5047f237a1d9c517c037c3863c4aeb625ad3fe37134a116e3eb0e55c6f3869cb04c81d3fdbd07f1bb38a4d2273ec6833d6f5a445153c220b7a8dc630433d94dd0fc5ad9a64fff134d9e0f25e2d1303633a519c105e5d7f98828c4947917cfc78d560b46be4ef1cb52bd73a4033a34472eed7437199dcd0dbe0d0d0ff5672b51f59209e208d69ef215c369abea6bd3263f94245643ed291d308aa506f51af461aa90fe2bd31588fbc3c6ba2f2128f1d8b4f180017a7d2b27e2d423aa4bc88bcd2ab9511d7f5756b30ce8490ddbf06479f2afd38e64f9c9ee70ad8cda9b3662407 [...]
+S1 = 000000000000000000000000000000000000000000000000000000000000000089a4164bb493f26848e87530b0c0892394d09ccc4b006e83d48a7fa851d655a6ec81e15c64f12bc7e25749f138c9f35d2894a3af5fcf013bb934c59468f305d1651c2e1184c41aaa91649be632a7e96c53cdca18081dac5da1b8040beb0b3de6,
+S2 = 00000000000000000000000000000000000000000000000000000000000000002752c45f3be0201f956d7e26fd4036d290a078ac14b8da032b29e3e0b24ed258a1847c4b65843924ada5556833d5f0996b9403c227771ac7dd8d7940ef7ad2f8c2bd0aa4336db97e307ab85a9cc1975e6f184ef2628988705a7009a89a4ded0dbb334421ffcb35585de862c8483130d1cfe86eb6dbbcac8728dd364b0bc4e57501f0c260bc570744b487548ce91967e05906053c6c9401decae583cd0bc8946d97ce0c333c1bdfcd7b6afed5b8205fdc804b328eb51e1700d304a3cee8f2c1027420e496b2e924fa7191af19192c58842fa3792 [...]
+T1 = 37d71b3c02d502304e99bfb6bfbb6ca92434926dfd5983d5d7701c303788a146f3ed1138746ce77cefc60c064501eed1e29648fddefd7231709e04852a51b4ef77c2007642ff4640d3aba1be68c9c91fd2f059b7aae5dfa3ab7ccf0b2d9ce47e75a1d8d317436787935ba316a00a8de961fbb01e119e8e65bbab6a5247b37b0e9102774bf8aaa5b61f43d12c6f4c8d9bf6a7f155dd8773aba682a95e55f4ef5e5abc774e1ffec0a03de7d97d5f9c2db5ea11c5af7b9f2d93bdd2ddc9d34cdf21516a40039b30f2fad1dae8156508bda4689eacf4fa5f924385800b77c9a08555c0c19fe0d9a860f8f7914da4e3eba199b50c1a2 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e220502363155b3082b6e0e90ad2f1bd3c1b8fc361b81994cd55983c1ef9207cdc054158b6f869f04014d05e8edc8bee2b06a18b84a989edadd1134deec8db6a3c9aa02025b9f444572591306584ac90a5a441201eebb472c46fc1f6be9398045e09170efb503735420dc172743ba9436b266b109348d3ebd3e80123d81286f4d2162d239c4fef6542a1e07e2d67020df3234b9563e922e025f665c7ddf84410fb1a702ce1a9bcc2cab7383588e50068a5c73c [...]
+
+TEST = 3,
+X = a6a9cf4bd4254c60140a4e00f0ff4040ea8eebcbef55e0b5637a75b491d49461,
+Y = 9b1da3500f963217275c127aa54fe1b02cd167d9d5f7fa9bc7333d40e5851f0a,
+R = 3c77b6726157e880cabb2bfd408435d64251a5134de5b59cb1f3514eef88f62086ef3f0e9db952403782e0ed25cd3bce513f4eaf916bcad2b1ecf3fdce4b68a8dc10693e1aeee76cb1e7001bf746618116e7fe932c2aaa9776e195b96f5c18b5c7358899a341d49de9776998c15cba213e0394e9f83dfa679688fa622f0df53c4871f7259cdef144cc0340462d36f77b221f6c8665f1fd4988e4f632aab5891d7bcfeb099919f2f1f4ea801585b7b2a149e93e25ebc9009c4f3671218d891f051d98c9565683fcaf2e42c43843177e7a1818ceeaaaf29db194148d7f9d0c5e2e103cdeedba6df5dbcaa4218349baeef472c0dae7 [...]
+E = 3d3365ac8890672dba5994e58f796acb5e6f7ccf6d1c9bd9dc5f8c12e3449ece,
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000cba2dcfc183df80f77aa4e8f83f3d3783f5ff6b2af446c2797dba02aa0c7a49c4f01db6469acc95d7bb65f0323874a7e0a9d06dcbb2e07cafc7188fbe61d2ae307bc2bbe2723aa9b7138b6cc1c679f8fe3b930fbb6b6de62347acb3223ec3ca1,
+BETA = a9716d1833a7056f586c7a16040efce6ae6a3640247aca5d24bd8954d57c440c9ff55f53f4485301e3d2fe854f243a9c6a79dafb8a0478a9cbe553bb3223fdfff8562fedcd970a6f1ef7a5c47679e589e731be4001fc37057d6bc4b90ae59452f7a266cfd5a7d19d684b0bc64a69a2e049c11204d5c4db1d60dbd4a590b6c2b49bb780d38039af5c42b4d0b92bfd7b73d772022cf2f0467b63c5c32e6fea5db8694b5e16ea3e08178b460377ea4f24b17297e2d3d11c3144ddac4e67c5e8e02ca4ee8dbc01b1832fd5a70a3312ed71179614fef445ab82949a543cf00867b67754cc453af51a9969d7e944825bc582de62367 [...]
+GAMMA = 972bacfd9f15307be138cdcb6af37579a7b00ef035e4577e3068bdc2fcfc897ea46c32153e2c5a84df02c3cedbf021a6fea0321636819f9f22a7e0b596533b9d8cc218bedd570cb97d25d133bb460ee9353378e4fcdbd759234a196e8402d6aa870bf0c90770f0ee34bc5ee85b916ac9b999b958299ad9b7cfe9d730ef50dcd51da11fe28e5660847755dc2edd4c805f517992ebb2f8b47452beaf8c05436645827a4f04ea8f75c4d487f3cf241f6929ccd3d04c883cd2848ae55ce9edd758cf90db780a9925bc6bae0a8f86d8f52a9ad81c5c47331af0cb16e96e808cbf075775e1d3e9dcb5c26cfbb1f276f5319aabeeb2 [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d164951d9317c7242cd9def6aa694109cf511e91129f61967c595454657a12fcc2a48c87e288511e7d5355bf646395b960c2640b70bf17fe2f5496939247e974669e3ce2b95893cad31dbd7b8d536945b0a8c5a59d17dfd1bc31301f4955cddf6f3ac6357752433f81a64c58b1dbb71f646c2554d2c9f04c435257100c4937cc3fbbf9e77a90dde4df3b3589487bdd683c356 [...]
+RHO1 = 00000000000000000000000000000000000000000000000000000000000000008ce0b500d59df9a605a9eff9768840905bec167a3b87c4cc26263dea552844b32cfc5dd8cc4add7ffb80e4519f85a5e88014e377d1c3d24c945b77eba69b9e9caed9a6cb745b964a44ae4920961cdca1203719272c8d8b5d2b70c8db45a4012a6a1d01ca255dc6accea9c2db9b3bc4e33d00ddc85e8c7bafb48ec6d44add53c7de31ff6652e7e7a742f15cdf81c6790152a4366317fbdb5b11f727722aa15c19957fa9eca5d293d2c0593c24fe87a17ac493fc8a5f5bac703b42ffd6399ca8517b8fabe935a823f1c7eb2a53691396445a8a5 [...]
+SIGMA = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363b5889f0a49e234d049dd3f93c9a4e11dea03221d6866a5918bf9106b687d136bd03eb4cbaeb2fe62da10b1c05adbd14b4175c6584fe53de36a7262b0f22e9d7a27af7a63c3d5ff0fcddd90a83382f4e1cc53adc2e9e42f4f18264e493b564a3e40996297af494cfcecae3fb6cf9ccbabff68e84a27e26125dae719861555513edc1bdc581ea0a56d2ab8ed39c8253ce54 [...]
+TAU = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b05ceae1765ec0a9a7dbefe1fd7575e2ed746dced5cc294bf2120bb0420202af9ef0c7ff4021e2ce7172a3d76b6225c7f985bdd260849dcdb1817dc486d89dc040f8696d98f8d7b6a4d4c3b985610f3260bced4f3e903f4659cd155ab50736a3c4503c886fed452f7ed71c02d48b8e7627a4991778441a4a0ca88024ee529e05e5542bfa2c9d804b1335ff179b687fadd6ec2 [...]
+N = bf7530dc0fb7780ee71ed25da80c0198ed1de4aa6b950ebb21682d9859fadbf17bd609a35e6270a21903365aa1f4eb215c0aa414fc54ea9575e6f1a2efb27e10badf5f32377687d8cd9f28b40b831c0faae4f16accb81d18c026e8c4602af9ab4ffa629ccf29504663fb7c0470799ce296cfe403bad1b0a79fd7cd6a38b8c1eedf0cb8fb2a1bbb9604eeebf416957dbed1d11e764c6c4e9f7024351c828dc946d0391d6e1d09e403c383e8d0148d6d88516ea91f19a81cf9e3a9b2c596ecb1996541bee928ba109a79391e08c8fc977486d70752abcc812aa7b638b9cbedbde28c63af3e3a7bed0190fd4bec93bb6c0b458d2f8c [...]
+S = 2a6b8594d8ae7aca0c1f54622847fa13ca01b6aa869698b91dfaf82d76e2bef8cf9cc9a5c7c31fe66835b505b552537bbeaa9d2d5dddbd98519ad34d996ac2971510db4f428dc9217e25792ac2b1a036addd9df7950a24508a166af14de8df42bd6f7ff346b21d9ba26ab3fb74e165c9a5a0f115963ec13b8b22363bd35add2c852df3fd68165b5896dd8a66122968af4f88b5791d51053fd12e8f01cf66b5a5492108130c4f34c988b080fed78adf45c9acfdfd113b111f15cab1b6adea1d2492a073df36ec01497dcc9924b655167a83f6f75146570eed37abcd93b82066ba1d0b624e646c4258b8f9559c5b83511247d9ce88 [...]
+S1 = 0000000000000000000000000000000000000000000000000000000000000000cba2dcfc183df80f77aa4e8f83f3d3783f5ff6b2af446c2797dba02aa0c7a49c76d9c7cf191d5a74d2bfd4ef8476c212b8d4fb921ccf6d712e34904e373df65b720bef529c245ce54940a24d5dd23988701d33d682d9fbb62507ab5c1d5380af,
+S2 = 00000000000000000000000000000000000000000000000000000000000000008ce0b500d59df9a605a9eff9768840905bec167a3b87c4cc26263dea552844b333f0844f4dc4b9e7568b89b2db816ddcb863579201d0a7fd33a7f2b8111abff038c790cabab4d5926f3e972901330bedc5d2350f4d78be39e3918d63273b39458f8d56eb1b20546d009a8f5912ee5e330ab074bb9c606b4acd889930f72b78af2860dc20e005bd16cb78acf27eff51bda1b0164bde015a87d826301fb3d79d6b209cdbf542df8a7341888013df447386f0b9d7084eb9a0a676cb3043378602cd1d02054fa36a2b07cc3a8b65674de3d974097f9 [...]
+T1 = 972bacfd9f15307be138cdcb6af37579a7b00ef035e4577e3068bdc2fcfc897ea46c32153e2c5a84df02c3cedbf021a6fea0321636819f9f22a7e0b596533b9d8cc218bedd570cb97d25d133bb460ee9353378e4fcdbd759234a196e8402d6aa870bf0c90770f0ee34bc5ee85b916ac9b999b958299ad9b7cfe9d730ef50dcd51da11fe28e5660847755dc2edd4c805f517992ebb2f8b47452beaf8c05436645827a4f04ea8f75c4d487f3cf241f6929ccd3d04c883cd2848ae55ce9edd758cfb5f0ac7771e72f2aeeda6bfa5871279d4de178f2a5175e309489559f2be60565deac7aa5f2717b8230911643c5fbf190ebbb1b8 [...]
+T2 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf70775788e315f315797cfb3c9a0001b9deddbc9020de7a3c03b526885da3ca1041e977a846fd5651f79cf1271c88cf83d9b61a866933bd0449edc6e0c40024b9534a60ab38c2e0a6608d0ad460572b101c7b70547a480be393bd9f7913c06738596247a9299736f45c8d5cf1cf5983702389f9c1fdb2c1f05ae2dd7db77ced206fc96b7a6b16ce92ab49a6bf42270cdb540aa320ec5c5d54dce9e8342528de6803dbadde650ddfae086165f2b3b10dfca7bf [...]
+
+TEST = 4,
+X = 4cca5149f68696cbae96b8893f6a326ca7ed9bdd0ad5c8fc0b76c2e853ae3829,
+Y = 81129c78feff170ce8e674d12ba194dca4e69c446af5cf800237757150bc6b97,
+R = 47c7f5384937e3d3cc2d3b278ad231f5dc550fcffdc89bbda4374292241cd31e6de0b06e2ac24087bd3ef7904ee51246aeefb6a56a319e4708542ad01d766b50d143be06d5496982f62439073779836bf57604180c4074e985f0c27e47d7d23db247cd6c158435f686e25a89011cc38ed4ed933a4c4159d9d9cbe62ed674dd08931faf9cc225dc76ef50a2b2b6a63d9ddb0777741b03414f190370437bee658d8c792c82c9d80e390c2483cec6a719c9f5d93d6ba753508e446ee173829abdae85c7efa5715f0267b61c5b06005153f08ca7e01c956cccbb7e12833e2fcae0c895963d46006074d3a204943404b323b20641b61d [...]
+E = ec220230cd217b754b0dfade659888e2f227784de4fa9aa72bfad4447879f47f,
+ALPHA = 0000000000000000000000000000000000000000000000000000000000000000b9178ca2c9eb48fa175b096949c4fd85f49105bf932ad90d966681e8b47e3b4e1134d65f9cf48a3f18e3e9eef02464821e3fe7b41ed199b6bbd8d22afccead725c0c3a90a63df0e0b3a7b2238840727ff50de68ecf186d6d2c34b2b866a22fbd,
+BETA = 0215e93acb85456fe55ff112b8060811b995cdcf2c04101b3f881a1a16a239d69e292413f97f79ac9f477e487bcfc8a04210f03cc873483c291d5fbbb6a33bc02ef3403b9404a0f9cdaea8a13234a696c74a0e0c5e1e5149e3cef54271470fc34b9983fd4cc19ed275d9c6b38e486e0512fc4c5c3eb50a4b38c38f4f2670b36898338ac8dc992db396e444edbca0c1d181581060b6316c5ec6009ed4d5092ddbc21f589f199899304b391bd6691790a0dc5747141c7979c3456ab93ca118ee10510b072c3c808876b1089097ec7457402830ed42edab96154ba5eec21005f91eacc6c41cd071aba7812512c39861b22912578 [...]
+GAMMA = 42a90dddca4df048e8627b66d5aeb61f4bb5efa0eeeb56fa15e30eecc43f3aaa57c675565a4d7279912e390eed9c11fa98f336bc82fb9fcb04111115e4ec7039803a971e21925703137c1f922cf332a473fd32361b6b9a6ea22bd209955bface4e6e2cb6edde57754a10e789585d435ebfb075684a32948873cf6a4c9db5a307a46c411af4d14cb0bb72a4d823e88650f55c3873ee7f28b89323473f196c989333f2af4a2981df1143d50e17b5c447c6fd4cc8ac7f8acfa55bd528597e4bc477957e810a806a6a64ea6bf0a5bdb6627b0defa3bc8f9285ae79f26c6d6e67a9d7a995ed42b29d06e4b944cd011c74d52e47d8 [...]
+RHO = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e1e1aa2831b2a2ad59740d89add71ed465ed10050acc957ba189349f1dc516376c4a6022ff37b6fee2a5d2777a80a1e662846df7d5d017a12cfbade16986fc21062deccfbe47f0606fba5c5f09099746df8c9b78913252a83655eba4e0c088207f8b6d5fbc42a62e2d80d996591382a9007b20887e946bf300f576a7e3ae9aba05d40b60063af9042125f533ba8cb94a90d7a [...]
... 1913 lines suppressed ...