chiark / gitweb /
Argh! RO[LR]64 broken on 32-bit shifts! Tested and fixed.
authormdw <mdw>
Sat, 5 Mar 2005 13:53:44 +0000 (13:53 +0000)
committermdw <mdw>
Sat, 5 Mar 2005 13:53:44 +0000 (13:53 +0000)
bits-testgen.c
bits.h
bits.in

index 7f48291..bd52b30 100644 (file)
@@ -63,6 +63,16 @@ static void gen_##op(void)                                           \
     fputs(";\n", stdout);                                              \
     mp_drop(x); mp_drop(y);                                            \
   }                                                                    \
+  for (i = 0; i < 4; i++) {                                            \
+    mp *x = mprand_range(MP_NEW, m64, r, 0);                           \
+    mp *y = mp_##op(MP_NEW, x, 32);                                    \
+    mp_div(0, &y, y, m64);                                             \
+                                                                       \
+    fputs(" ", stdout);                                                        \
+    putmp(x); printf(" 32"); putmp(y);                                 \
+    fputs(";\n", stdout);                                              \
+    mp_drop(x); mp_drop(y);                                            \
+  }                                                                    \
   fputs("}\n", stdout);                                                        \
 }
 
diff --git a/bits.h b/bits.h
index 175e927..4618589 100644 (file)
--- a/bits.h
+++ b/bits.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: bits.h,v 1.10 2004/04/08 01:36:11 mdw Exp $
+ * $Id$
  *
  * Portable bit-level manipulation macros
  *
@@ -217,12 +217,15 @@ typedef unsigned char octet;
      unsigned _s = (s) & 63u;                                          \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
-     if (_s >= 32) {                                                   \
+     if (_s > 32) {                                                    \
        _d->hi = LSL32(_l, _s - 32u) | LSR32(_h, 64u - _s);             \
        _d->lo = LSL32(_h, _s - 32u) | LSR32(_l, 64u - _s);             \
      } else if (!_s) {                                                 \
        _d->lo = _l;                                                    \
        _d->hi = _h;                                                    \
+     } else if (_s == 32) {                                            \
+       _d->lo = _h;                                                    \
+       _d->hi = _l;                                                    \
      } else {                                                          \
        _d->hi = LSL32(_h, _s) | LSR32(_l, 32u - _s);                   \
        _d->lo = LSL32(_l, _s) | LSR32(_h, 32u - _s);                   \
@@ -232,12 +235,15 @@ typedef unsigned char octet;
      unsigned _s = (s) & 63u;                                          \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
-     if (_s >= 32) {                                                   \
+     if (_s > 32) {                                                    \
        _d->hi = LSR32(_l, _s - 32u) | LSL32(_h, 64u - _s);             \
        _d->lo = LSR32(_h, _s - 32u) | LSL32(_l, 64u - _s);             \
      } else if (!_s) {                                                 \
        _d->lo = _l;                                                    \
        _d->hi = _h;                                                    \
+     } else if (_s == 32) {                                            \
+       _d->lo = _h;                                                    \
+       _d->hi = _l;                                                    \
      } else {                                                          \
        _d->hi = LSR32(_h, _s) | LSL32(_l, 32u - _s);                   \
        _d->lo = LSR32(_l, _s) | LSL32(_h, 32u - _s);                   \
diff --git a/bits.in b/bits.in
index 5b1272e..fcf7275 100644 (file)
--- a/bits.in
+++ b/bits.in
 # Test vectors for 64-bit operations [generated]
 
 lsl64 {
-  e4bef260d7bcda16 49 b42c000000000000;
-  d348b7551195e770 16 b7551195e7700000;
-  7dd1dff7dac5c994  1 fba3bfefb58b9328;
-  d0c6eb14ad568f86 63 0000000000000000;
-  dc9268eeee533285 59 2800000000000000;
-  810c9b689daaa906  8 0c9b689daaa90600;
-  4b6003062365b0a5 19 18311b2d85280000;
-  c76c160f11896c47 42 25b11c0000000000;
-  6ecfa14a7130c9f1 53 3e20000000000000;
-  0634c9519848a877 50 a1dc000000000000;
-  bf79192a5b50ade5 41 a15bca0000000000;
-  739a3d1f337f2954 36 37f2954000000000;
-  0d27a4ba23408540 17 497446810a800000;
-  36512061f7080cc0 54 3000000000000000;
-  591d8fa21f2dd883 61 6000000000000000;
-  cde8e160ad10997a 34 b44265e800000000;
-  5c6d62c9269029df  6 1b58b249a40a77c0;
-  57acc87638f50804 39 7a84020000000000;
-  d9ff61cdbda3b3e9 10 fd8736f68ecfa400;
-  31ebfedd4705e505 22 b751c17941400000;
-  35dceaa7b1cc49ae  4 5dceaa7b1cc49ae0;
-  c38201a894476b3f 49 d67e000000000000;
-  752eb9529533966f 28 29533966f0000000;
-  3eb621b7f65b0009 33 ecb6001200000000;
-  0ef2f9b2fc5fa450 11 97cd97e2fd228000;
-  9b542cde52ebfda1 23 6f2975fed0800000;
-  cc520f215eb57bb3 20 f215eb57bb300000;
-  ebbbb18ac6c95a97 47 ad4b800000000000;
-  30370c33d090c542 16 0c33d090c5420000;
-  d6b3ad54efc9a383 61 6000000000000000;
-  b93bf4f2aad2605f 58 7c00000000000000;
-  b03fb648e27fff63 53 ec60000000000000;
-  58fe2b69ac26afa3  9 fc56d3584d5f4600;
-  29b94586306fed54  8 b94586306fed5400;
-  8f28523c03d4de16 10 a148f00f53785800;
-  7846b710ee72807a 21 e21dce500f400000;
-  bfb474fd71d891f2 69 f68e9fae3b123e40;
-  5d1563259f9eb53b 67 e8ab192cfcf5a9d8;
-  a629c54d57dd2d42 41 ba5a840000000000;
-  00df9fcbaca48b77 22 f2eb2922ddc00000;
-  89196d1ebba10b04 17 da3d774216080000;
-  9fc2712a199e533f 14 9c4a866794cfc000;
-  6308cdec3f768281 59 0800000000000000;
-  a9b9a222bd689aef 36 d689aef000000000;
-  306ceb0c6b08ac8b  5 0d9d618d61159160;
-  260c571b4a42bb8f 16 571b4a42bb8f0000;
-  3bfa6a5cfb0bad7d 24 5cfb0bad7d000000;
-  4ade49cb3b6f5fe8 58 a000000000000000;
-  31115c037ba323fe 41 4647fc0000000000;
-  151784873f0eb5b6 54 6d80000000000000;
-  6794c18b5337685a 67 3ca60c5a99bb42d0;
-  65b9aca338527ef1 51 f788000000000000;
-  c063c46f88de9fd4 62 0000000000000000;
-  d7b97e23e6eabdff 25 47cdd57bfe000000;
-  211499268878dbf3 21 24d10f1b7e600000;
-  ad89d4b9b12012e4 16 d4b9b12012e40000;
-  f46795630e7952d2 62 8000000000000000;
-  2d7100b8b649377d 37 c926efa000000000;
-  f083455b663e4ee1 21 ab6cc7c9dc200000;
-  3c8f2aebfa921451 19 575fd490a2880000;
-  af5813b70d30ce2f 51 7178000000000000;
-  6ef315d079839180 37 3072300000000000;
-  8da3aefc5f8584b7 56 b700000000000000;
-  17669c0f16e39815 46 e605400000000000;
+  22907dd1dff7dac5  7 483ee8effbed6280;
+  1d26d0c6eb14ad56 13 da18dd6295aac000;
+  edd1dc9268eeee53 56 5300000000000000;
+  7130c9f137120634 41 240c680000000000;
+  3d1f337f29549e6b 53 cd60000000000000;
+  512061f7080cc07d 66 448187dc203301f4;
+  cde8e160ad10997a  5 bd1c2c15a2132f40;
+  6057acc87638f508 64 6057acc87638f508;
+  49ae1d50c38201a8 20 d50c38201a800000;
+  2cde52ebfda19d0c 66 b3794baff6867430;
+  0f215eb57bb3a4f3 25 6af76749e6000000;
+  370c33d090c54215  1 6e1867a1218a842a;
+  b3ad54efc9a38378 35 4d1c1bc000000000;
+  b03fb648e27fff63 66 c0fed92389fffd8c;
+  9829b94586306fed 10 a6e51618c1bfb400;
+  00157846b710ee72 22 11adc43b9c800000;
+  2219bfb474fd71d8 17 7f68e9fae3b00000;
+  4bb65d1563259f9e 61 c000000000000000;
+  8b77dba189196d1e 23 d0c48cb68f000000;
+  3f768281e040a9b9 54 6e40000000000000;
+  bd689aef66f5306c 51 8360000000000000;
+  6b08ac8b0a22260c  1 d611591614444c18;
+  5cfb0bad7d95214a 36 d95214a000000000;
+  6794c18b5337685a 16 c18b5337685a0000;
+  1e72d7b97e23e6ea 39 11f3750000000000;
+  12e4713df4679563 62 c000000000000000;
+  49377d20a8f08345 33 51e1068a00000000;
+  3e4ee1315f3c8f2a 47 4795000000000000;
+  921451dcd1af5813 29 9a35eb0260000000;
+  798391805da08da3 40 a08da30000000000;
+  5f8584b7c5e61766 54 d980000000000000;
+  d1ecdf3d264a7f16 15 6f9e93253f8b0000;
+  c2e815f422cdf0c8 53 1900000000000000;
+  147ed12ca986981a  9 fda259530d303400;
+  98ad0abef8bc4fcb 36 8bc4fcb000000000;
+  7e98ef1f0446b42f 45 d685e00000000000;
+  d44b6d00f06dc188 14 db403c1b70620000;
+  a784e0c6f21195a3  5 f09c18de4232b460;
+  ae985511265febd1 34 997faf4400000000;
+  4720eef9eb1c8dd0 24 f9eb1c8dd0000000;
+  eb0cfa9138ddc399 54 e640000000000000;
+  5608fe95e81c2533 31 f40e129980000000;
+  9c1a9851bc2810d8 26 46f0a04360000000;
+  a089c3f9099c5ffb 28 9099c5ffb0000000;
+  69f6a9f2c0945ffd 58 f400000000000000;
+  03cc0cae9ce021a5 39 7010d28000000000;
+  4ffa91544485f1a1 21 2a8890be34200000;
+  1770a18cbfe6effd 67 bb850c65ff377fe8;
+  778554acf1270485 20 4acf127048500000;
+  827b480aa3a4c84c 33 4749909800000000;
+  f6c9b53bf8f957f4 10 26d4efe3e55fd000;
+  f43e89957f9a3e81 46 8fa0400000000000;
+  743d16687b7bb8de 33 f6f771bc00000000;
+  dad9e9a79b1abf91 18 a69e6c6afe440000;
+  42c2ecccb44d65ba 65 8585d999689acb74;
+  b0ef5746ea8fdccc  0 b0ef5746ea8fdccc;
+  957eb6d6699e6b7e 14 adb59a679adf8000;
+  5cb2dac07ecde957 69 965b580fd9bd2ae0;
+  46fee6dda7abc8ad 62 4000000000000000;
+  ac90cfe22d2f1f29  0 ac90cfe22d2f1f29;
+  42fa8b669ed3bb35  6 bea2d9a7b4eecd40;
+  5e51881e99027b8a 47 3dc5000000000000;
+  a3ccf860b0009740 14 3e182c0025d00000;
+  1c1b9fc214e9ca21  4 c1b9fc214e9ca210;
+  308ba60076817523 32 7681752300000000;
+  9c2835076a23faac 32 6a23faac00000000;
+  dd67771cc667a833 32 c667a83300000000;
+  06148f302c3973ac 32 2c3973ac00000000;
 }
 
 lsr64 {
-  cfce3ed1ecdf3d26 37 00000000067e71f6;
-  16cb16c2e815f422 55 000000000000002d;
-  c8e30308be3c31e6 35 00000000191c6061;
-  c0b7cadcb658b970  4 0c0b7cadcb658b97;
-  79a684b5aefa69a4 63 0000000000000000;
-  147ed12ca986981a  7 0028fda259530d30;
-  98ad0abef8bc4fcb 64 98ad0abef8bc4fcb;
-  7e98ef1f0446b42f 62 0000000000000001;
-  d44b6d00f06dc188 60 000000000000000d;
-  a784e0c6f21195a3 47 0000000000014f09;
-  ae985511265febd1 30 00000002ba615444;
-  4720eef9eb1c8dd0 12 0004720eef9eb1c8;
-  51f284649016ed00  1 28f94232480b7680;
-  31854bc78bf43966 26 0000000c6152f1e2;
-  fa9138ddc3990844 47 000000000001f522;
-  fe95e81c2533e31c 12 000fe95e81c2533e;
-  9851bc2810d858cb 31 0000000130a37850;
-  24d126b807e6daa0 26 000000093449ae01;
-  f9099c5ffb824173 40 0000000000f9099c;
-  4c04226f30cbb7f0 10 001301089bcc32ed;
-  73a8cd1901073147 50 0000000000001cea;
-  7456f3ff669c732b 18 00001d15bcffd9a7;
-  8f48af65f7cc9e3f 13 00047a457b2fbe64;
-  1721b730374ffc9b 54 000000000000005c;
-  f56ccbb2f294b387 34 000000003d5b32ec;
-  69f6a9f2c0945ffd 64 69f6a9f2c0945ffd;
-  03cc0cae9ce021a5 60 0000000000000000;
-  4ffa91544485f1a1 57 0000000000000027;
-  2b9b8f0911e32d65 44 000000000002b9b8;
-  70a18cbfe6effd1f  6 01c28632ff9bbff4;
-  8554acf1270485b2 32 000000008554acf1;
-  c1c4c967c0a458cb 31 00000001838992cf;
-  dd409b687fa3a682 38 000000000375026d;
-  0aa3a4c84cef64f6 62 0000000000000000;
-  3bf8f957f4b03cf4 35 00000000077f1f2a;
-  957f9a3e8128f874 18 0000255fe68fa04a;
-  687b7bb8deb9bd20 50 0000000000001a1e;
-  e04c091d205cdad9 65 7026048e902e6d6c;
-  9b1abf91b0851e5c 53 00000000000004d8;
-  ac84513995870116 21 000005642289ccac;
-  8a15dde524af3e2b 25 000000450aeef292;
-  46541a42c2ecccb4 52 0000000000000465;
-  bad397abfaf529ee 32 00000000bad397ab;
-  9a05c7efedef3401  1 4d02e3f7f6f79a00;
-  51d2a90bbf7f1bfc 11 000a3a552177efe3;
-  b0ef5746ea8fdccc 29 00000005877aba37;
-  e33f7e8a5718fd25 38 00000000038cfdfa;
-  07c8e7d715a92add  3 00f91cfae2b5255b;
-  d1f5c054b2d98351  2 347d70152cb660d4;
-  ec590294a319b980 49 000000000000762c;
-  a9f891bc5ba5afab 12 000a9f891bc5ba5a;
-  122d12d7ff3c4112 30 0000000048b44b5f;
-  d17d4569eaff59a3 34 00000000345f515a;
-  58d5d5589bfe0797 43 00000000000b1aba;
-  1a957eb6d6699e6b 29 00000000d4abf5b6;
-  725cb2dac07ecde9 54 00000000000001c9;
-  ac46fee6dda7abc8  2 2b11bfb9b769eaf2;
-  daac90cfe22d2f1f 47 000000000001b559;
-  cc42fa8b669ed3bb 48 000000000000cc42;
-  a9cf44bbc8c6254d 61 0000000000000005;
-  98bd94e66eb4563d 34 00000000262f6539;
-  51881e99027b8ab9 20 0000051881e99027;
-  ccf860b000974076 48 000000000000ccf8;
-  836c5f87b9546093 28 0000000836c5f87b;
+  2352fd61e4fa8fec 55 0000000000000046;
+  c861a8b33779f09e 38 00000000032186a2;
+  fc02a8f48afa3080 12 000fc02a8f48afa3;
+  7c486315799dc875 61 0000000000000003;
+  2b5b0677da1ac273 19 0000056b60cefb43;
+  893232a9f81d1451 47 0000000000011264;
+  e475f6b94a43a67b 29 0000000723afb5ca;
+  0d2f9aaafe2dd721 36 0000000000d2f9aa;
+  ba8095ffab1eaadf 40 0000000000ba8095;
+  1f813e28a1397a79 54 000000000000007e;
+  2941feeffdc2eb44 60 0000000000000002;
+  0d5e8f444f7f4e0c 65 06af47a227bfa706;
+  0013e5150686d230 35 0000000000027ca2;
+  49e2414ebf47970e 34 0000000012789053;
+  75cff206877de691 32 0000000075cff206;
+  c3ab6cf8556b7aa7 12 000c3ab6cf8556b7;
+  5948d1b8834df219 28 00000005948d1b88;
+  ec1718dcdeee0d52 41 0000000000760b8c;
+  e4758a386a9943e9  3 1c8eb1470d53287d;
+  b9a80f34c0fde11c 46 000000000002e6a0;
+  9e544e0c536ca1e0 18 00002795138314db;
+  8485290a4d87d13b 11 001090a52149b0fa;
+  1cccada8c1a0a9aa 11 00039995b5183415;
+  4e3c3554f8fb1ef6 36 0000000004e3c355;
+  c270295dfc0ca655 26 000000309c0a577f;
+  bdb75359f91cb9d9 35 0000000017b6ea6b;
+  ce6c0b396179d31f 12 000ce6c0b396179d;
+  1da1ae8f4ae480cd 11 0003b435d1e95c90;
+  d6cf2bacf6f9fd3f 38 00000000035b3cae;
+  01325eb855323665  4 001325eb85532366;
+  788d73d192ee53b3  7 00f11ae7a325dca7;
+  5de25b1593b70f86 61 0000000000000002;
+  2d90a9b59ed034a8 23 0000005b21536b3d;
+  2d25d54756fa5c47 23 0000005a4baa8ead;
+  33922a22d9fd8815 57 0000000000000019;
+  5eb9d85197a21cc3 40 00000000005eb9d8;
+  d5ae7be8dbf98e4f 28 0000000d5ae7be8d;
+  cf6b1372a5aa47b5 65 67b589b952d523da;
+  c783443d64f2ed6a 61 0000000000000006;
+  f86b799e2a168116 42 00000000003e1ade;
+  56445a09898eaa96 47 000000000000ac88;
+  8eedb969ffe07669 16 00008eedb969ffe0;
+  bb7a24c69f13d099 18 00002ede8931a7c4;
+  ffc1ba78c70dda7a 50 0000000000003ff0;
+  a25e771702fb1901  6 028979dc5c0bec64;
+  8a959cb8e75079bb 53 0000000000000454;
+  cc8c54f31b450e88 28 0000000cc8c54f31;
+  cb0f58a1e34c8b15 57 0000000000000065;
+  1986c251f5b70be2 64 1986c251f5b70be2;
+  8995e6c932a17eab 47 000000000001132b;
+  ddb8e4ba463c6630 69 06edc725d231e331;
+  ae8a7a899e4279d5 49 0000000000005745;
+  8d5be74088e4097e 43 000000000011ab7c;
+  6c9e4fba61339d6d 56 000000000000006c;
+  ab7707ca48ff5ba1 10 002addc1f2923fd6;
+  1addf5748729720a 36 0000000001addf57;
+  079c0a2535ded561 48 000000000000079c;
+  e3d33dcf7c71cd7d 19 00001c7a67b9ef8e;
+  71e554a6850d5588 21 0000038f2aa53428;
+  7ae6994fc8528bd1  6 01eb9a653f214a2f;
+  4a2404a059f7f99c 14 00012890128167df;
+  9ce757b3e7a1d075 55 0000000000000139;
+  6d94238ab56d738e  0 6d94238ab56d738e;
+  7de6496247060e7b 65 3ef324b12383073d;
+  6a0c897031ad09a5 32 000000006a0c8970;
+  fa687ec3bad8e18d 32 00000000fa687ec3;
+  ad361f1e226e7887 32 00000000ad361f1e;
+  d35f86c639733c5c 32 00000000d35f86c6;
 }
 
 rol64 {
-  288c69d80ea12ff4  3 44634ec075097fa1;
-  069b8a2e86041c1b 48 1c1b069b8a2e8604;
-  14e9ca2186ddf1f6 56 f614e9ca2186ddf1;
-  aa7e740da967828e 62 aa9f9d036a59e0a3;
-  b35b15ffaa6c3680 66 cd6c57fea9b0da02;
-  45563a308ba60076 63 22ab1d1845d3003b;
-  23bd2abf1261b089 20 abf1261b08923bd2;
-  3a9c2835076a23fa  8 9c2835076a23fa3a;
-  dd67771cc667a833 48 a833dd67771cc667;
-  170b66283e4f834a 34 f93e0d285c2d98a0;
-  8f302c3973accd56  5 e605872e7599aad1;
-  4e33958b8c2e2352 60 24e33958b8c2e235;
-  e4fa8fec816ac861 47 6430f27d47f640b5;
-  3779f09e7a10fc02 64 3779f09e7a10fc02;
-  8afa3080ee119a52  6 be8c203b846694a2;
-  17e4f2b94b0820ca 29 2961041942fc9e57;
-  a8cffeea7c486315 30 9f1218c56a33ffba;
-  c875fba578c8ec48 53 89190ebf74af191d;
-  8a92142b5b0677da 35 d833bed45490a15a;
-  73117b45bcfff5d5 43 ffaeab988bda2de7;
-  fde2893232a9f81d 51 c0efef144991954f;
-  7ffae475f6b94a43  1 fff5c8ebed729486;
-  3d380d2f9aaafe2d 46 bf8b4f4e034be6aa;
-  c0095c8808847689 18 72202211da270025;
-  50ba8095ffab1eaa 63 285d404affd58f55;
-  fd22ac1976063e11 23 0cbb031f08fe9156;
-  1f813e28a1397a79 41 72f4f23f027c5142;
-  d7f4220c785fe426 16 220c785fe426d7f4;
-  e80f678d40414784 38 1051e13a03d9e350;
-  feeffdc2eb44dc8c 59 67f77fee175a26e4;
-  8f444f7f4e0c8939 53 2731e889efe9c191;
-  4dc23a7bb40e7e00 68 dc23a7bb40e7e004;
-  150686d2301b43a1 14 a1b48c06d0e84541;
-  e81d7f5cedaa49e2 57 c5d03afeb9db5493;
-  bf47970e560475cf 25 1cac08eb9f7e8f2e;
-  877de69146acc3ab 53 7570efbcd228d598;
-  556b7aa776945948 39 4a2ca42ab5bd53bb;
-  834df2196c92ec17 61 f069be432d925d82;
-  deee0d52d9539726 27 96ca9cb936f7706a;
-  0391b3f9d10c39b0 43 61cd801c8d9fce88;
-  f08ce7cee4758a38 50 28e3c2339f3b91d6;
-  43e97dedfbe61e73 48 1e7343e97dedfbe6;
-  cd09c2b9a80f34c0 55 606684e15cd4079a;
-  1c2481b11fc76bfa 12 481b11fc76bfa1c2;
-  710a9e544e0c536c 21 ca89c18a6d8e2153;
-  40f9ad5b04140d98 34 1050366103e6b56c;
-  e08485290a4d87d1 49 0fa3c1090a52149b;
-  398a1458c2c6b61d 35 1635b0e9cc50a2c6;
-  1cccada8c1a0a9aa 28 8c1a0a9aa1cccada;
-  4e3c3554f8fb1ef6 29 9f1f63dec9c786aa;
-  c270295dfc0ca655  1 84e052bbf8194cab;
-  bdb75359f91cb9d9 57 b37b6ea6b3f23973;
-  6b7de74fc9a9b371  6 df79d3f26a6cdc5a;
-  6c0b396179d31f06 61 cd81672c2f3a63e0;
-  5982cbc0d7cb2384 52 3845982cbc0d7cb2;
-  ae8f4ae480cda98a 30 20336a62aba3d2b9;
-  2bacf6f9fd3f8213 20 6f9fd3f82132bacf;
-  3f3df6c2b3fac7cb 17 ed8567f58f967e7b;
-  523d4723f9180132 17 8e47f2300264a47a;
-  553236651c96788d 60 d553236651c96788;
-  92ee53b3f3ebd66d 13 ca767e7d7acdb25d;
-  cedbe88e245de25b  0 cedbe88e245de25b;
-  b70f8601562d90a9 52 0a9b70f8601562d9;
-  d034a867642d25d5 44 d25d5d034a867642;
+  4aed8aaebabb7e0f  0 4aed8aaebabb7e0f;
+  a37fc5cc09f7f62f 36 9f7f62fa37fc5cc0;
+  23fcd2dec5de24d2 66 8ff34b7b17789348;
+  c839839c1b06319f 24 9c1b06319fc83983;
+  b54bdd13c17ef292 58 4ad52f744f05fbca;
+  d3caeb5e57fd21df 60 fd3caeb5e57fd21d;
+  6186265ee6ea4590 51 2c830c3132f73752;
+  cb822fb2ef953aea 63 65c117d977ca9d75;
+  03e0fce2e1b9511b 69 7c1f9c5c372a2360;
+  c86e67f123377a8f 24 f123377a8fc86e67;
+  b8dcc73ae1b3c6cd 31 70d9e366dc6e639d;
+  4e3cb24284cfed17 65 9c796485099fda2e;
+  66b0a6689cf0969c 68 6b0a6689cf0969c6;
+  8fca80e322a4b1bf 41 49637f1f9501c645;
+  1220450433efb6b6 40 efb6b61220450433;
+  d820cf27a64b9d47 24 27a64b9d47d820cf;
+  845dac557bb3e75f 66 1176b155eecf9d7e;
+  fb8e173416867fcd 12 e173416867fcdfb8;
+  d58b10f91d07a037  5 b1621f23a0f406fa;
+  b96e83c4bf2fb5b2 33 7e5f6b6572dd0789;
+  d663cb3884b2a0a8 55 546b31e59c425950;
+  5df752423f3179bf 55 dfaefba9211f98bc;
+  3564672e370ffc37 26 b8dc3ff0dcd5919c;
+  a31e8aac1d426ce1 11 f45560ea13670d18;
+  4780e974a8a2a0e7 39 515073a3c074ba54;
+  0fd0d7f69fa658ab 67 7e86bfb4fd32c558;
+  40d304128719b541 27 9438cdaa0a069820;
+  322b3bf7d02cec05 39 16760299159dfbe8;
+  96cec07591ada462 17 80eb235b48c52d9d;
+  ba3037235e19a394 48 a394ba3037235e19;
+  56b4cfc5555e925e 58 795ad33f15557a49;
+  d39040e632d56264 52 264d39040e632d56;
+  e6a427b99a5dc266 50 099b9a909ee66977;
+  cc034b9f099f0467 28 f099f0467cc034b9;
+  9da898b39324cd30 31 c99266984ed44c59;
+  51014f6796f9c488 59 42880a7b3cb7ce24;
+  dd678d490c2f320f 46 cc83f759e352430b;
+  3c484fb34bd52239 33 97aa447278909f66;
+  2cb8ecf4f64e3298 16 ecf4f64e32982cb8;
+  73be257a753b3820 33 ea767040e77c4af4;
+  3f94a079bde2dd98 60 83f94a079bde2dd9;
+  702db2ba11927589 63 b816d95d08c93ac4;
+  340af7b91f9632fc  2 d02bdee47e58cbf0;
+  761ca16434a9935e 28 434a9935e761ca16;
+  11c1cb072f32a59c 27 3979952ce08e0e58;
+  97d9a7b0556463ff 27 82ab231ffcbecd3d;
+  ebc43263391424d0 31 9c8a126875e21931;
+  c897a8a484313243 34 10c4c90f225ea292;
+  1b5302ccd501b538  3 da981666a80da9c0;
+  0764ee4ce1d3fc04 38 74ff0101d93b9338;
+  4f7d8c0c48ad7d6f 20 c0c48ad7d6f4f7d8;
+  d5c8d92dbd873a8f 23 96dec39d47eae46c;
+  63aae01a2a199d3a 61 4c755c03454333a7;
+  30a6d917fa0c1a23 32 fa0c1a2330a6d917;
+  bc8a4cba45b20543 25 748b640a87791499;
+  fc1b9dbce078b87a 65 f8373b79c0f170f5;
+  acf03897b95a3f37  0 acf03897b95a3f37;
+  d0544b5151db0a16 57 2da0a896a2a3b614;
+  9e8f2fc12c7f839f 49 073f3d1e5f8258ff;
+  9a0056284a697ffd 27 42534bffecd002b1;
+  dead83f5a356e910 55 886f56c1fad1ab74;
+  260ea9379cc72321 24 379cc72321260ea9;
+  17158fee8ca42e75  1 2e2b1fdd19485cea;
+  4f497b3734be301d 55 0ea7a4bd9b9a5f18;
+  5fe692629db57311 32 9db573115fe69262;
+  22f3a1573f9e0553 32 3f9e055322f3a157;
+  3e96265e4326fa53 32 4326fa533e96265e;
+  de3d4eb23cacdf6e 32 3cacdf6ede3d4eb2;
 }
 
 ror64 {
-  fa5c47f16f64b837 12 837fa5c47f16f64b;
-  26214211a1c696ba 52 14211a1c696ba262;
-  10abb433922a22d9 13 16c8855da19c9151;
-  1519165eb9d85197 36 eb9d851971519165;
-  c34ac0d5ae7be8db 14 a36f0d2b0356b9ef;
-  4ffed2cf6b1372a5  7 4a9ffda59ed626e5;
-  b54fd9d70c70e117 12 117b54fd9d70c70e;
-  ae71b3a56f0e7d83 69 1d738d9d2b7873ec;
-  9cc783443d64f2ed  9 76ce63c1a21eb279;
-  b96856beca34fd65 21 a7eb2dcb42b5f651;
-  f86b799e2a168116 13 08b7c35bccf150b4;
-  055f0fd3001da597  9 cb82af87e9800ed2;
-  6d465b7b1419ea51 58 5196dec5067a945b;
-  8f938f6daafbd656 26 bef595a3e4e3db6a;
-  09898eaa96ffc3d1 29 b7fe1e884c4c7554;
-  1e4e34c94b8bfae6 69 30f271a64a5c5fd7;
-  ecd75a66d88eedb9 60 cd75a66d88eedb9e;
-  e07669845ebb7a24 51 cd308bd76f449c0e;
-  13d099f47166edf5 59 7a133e8e2cddbea2;
-  e88fbf433a7ff212 21 ff9097447dfa19d3;
-  79e79771f6eee728  7 50f3cf2ee3edddce;
-  78ef2b800d7b969d 51 e57001af72d3af1d;
-  80ffc1ba78c70dda  0 80ffc1ba78c70dda;
-  a2a25e771702fb19 30 5c0bec668a8979dc;
-  fc8a959cb8e75079 49 4ace5c73a83cfe45;
-  8ccc8c54f31b450e 57 66462a798da28746;
-  e9002926ad0284c7 46 a49ab40a131fa400;
-  cb0f58a1e34c8b15 63 961eb143c699162b;
-  0c1b627235a2cb84 42 9c8d68b2e10306d8;
-  86c251f5b70be236 66 a1b0947d6dc2f88d;
-  7265264e0da72efe 65 3932932706d3977f;
-  e6c932a17eab511e  5 f73649950bf55a88;
-  e4ba463c663035a6  1 725d231e33181ad3;
-  7a899e4279d54d03 15 9a06f5133c84f3aa;
-  f3e961dcfd40088d 19 0111be7d2c3b9fa8;
-  4088e4097efb0368 41 04bf7d81b4204472;
-  f431ee6988cf2a0e 21 795077a18f734c46;
-  b3de79c4f86c9e4f 56 de79c4f86c9e4fb3;
-  339d6d907eab7707 51 adb20fd56ee0e673;
-  ff5ba1ae93d16225 56 5ba1ae93d16225ff;
-  de5747bc1addf574 29 d6efaba6f2ba3de0;
-  720a320fe14fd29c 10 a71c828c83f853f4;
-  314fe2079c0a2535  2 4c53f881e702894d;
-  6112d6e3d33dcf7c 43 dc7a67b9ef8c225a;
-  7d130323794e3da8 65 3e898191bca71ed4;
-  f69703a9caf02d2a 44 3a9caf02d2af6970;
-  ac71e554a6850d55 47 caa94d0a1aab58e3;
-  8c7ae6994fc8528b 58 1eb9a653f214a2e3;
-  374fc43581d2f72a  0 374fc43581d2f72a;
-  4a2404a059f7f99c 69 e251202502cfbfcc;
-  a0c879d6d4455b38 57 643ceb6a22ad9c50;
-  e757b3e7a1d07585 50 ecf9e8741d6179d5;
-  7ea9c7c9cf54f3bc 37 4e7aa79de3f54e3e;
-  238ab56d738e02ab 62 8e2ad5b5ce380aac;
-  477cd726d6f3ebcd 42 c9b5bcfaf351df35;
-  eab50906642a7de6  0 eab50906642a7de6;
-  47060e7be3632ed9 48 0e7be3632ed94706;
-  bb42f45a8733b2cd 48 f45a8733b2cdbb42;
-  d1d905cfdb299830 49 82e7ed94cc1868ec;
-  bcdb686a0c897031 11 06379b6d0d41912e;
-  a5b8fa687ec3bad8 57 dc7d343f61dd6c52;
-  c2ad361f1e226e78 41 0f8f11373c61569b;
-  d35f86c639733c5c 46 1b18e5ccf1734d7e;
-  ed8aaebabb7e0f24 54 2abaeaedf83c93b6;
+  ad8ca13187eba153 37 8c3f5d0a9d6c6509;
+  ba31582b3793b05f 42 0acde4ec17ee8c56;
+  9f80c5814b91f4d3  5 9cfc062c0a5c8fa6;
+  9943307fa4ef095e 62 650cc1fe93bc257a;
+  7c9351366ef8e98e 26 be3a639f24d44d9b;
+  b48aa989dbb8d0f1 56 8aa989dbb8d0f1b4;
+  b2dab2863e574842 58 b6aca18f95d210ac;
+  97782f16c5816270 17 b1384bbc178b62c0;
+  8f4bdbd6ebdfbafb 41 eb75efdd7dc7a5ed;
+  f5427dbee5f95b53 68 3f5427dbee5f95b5;
+  cb6d7c128b79f465 38 4a2de7d1972db5f0;
+  0f20d40224baac3a 40 0224baac3a0f20d4;
+  63c1f3f00f301cc9 46 cfc03cc073258f07;
+  bfea6d561ab5aea5  6 96ffa9b5586ad6ba;
+  5c7a8d2fc4feef99 47 1a5f89fddf32b8f5;
+  b6c86db981143082 35 3022861056d90db7;
+  6473a86a5da3d2e8 13 9743239d4352ed1e;
+  602ebbaf08bf9315 27 17f262ac05d775e1;
+  38a1c33beb408771 47 8677d6810ee27143;
+  a3f63408d3b27df5 35 1a764fbeb47ec681;
+  ed5537bfb0162f05 41 dfd80b1782f6aa9b;
+  d1b2c36ceec1dc40  6 0346cb0db3bb0771;
+  3aed7667c6342c83 35 f8c68590675daecc;
+  eef301f2c93fda30 14 68c3bbcc07cb24ff;
+  f7987116dba62d93 21 316c9fbcc388b6dd;
+  70274ffe5a6506e4  7 c8e04e9ffcb4ca0d;
+  6bcedb015be40bfb 24 e40bfb6bcedb015b;
+  68d7d2ce372a8a38 44 2ce372a8a3868d7d;
+  569863bbd3ad4290 53 c31dde9d6a1482b4;
+  776ee19eb0a86714 64 776ee19eb0a86714;
+  3292af9ac5ff48a0 14 2280ca4abe6b17fd;
+  e0136f6237637451 54 4dbd88dd8dd14780;
+  45b31f52265dfa0f 27 cbbf41e8b663ea44;
+  0392ea7314124aeb 55 25d4e6282495d607;
+  c7319c116207607f 27 40ec0ff8e633822c;
+  3bfa119be8284f3a 42 66fa0a13ce8efe84;
+  e760886e4d3bf414 46 21b934efd0539d82;
+  b27749f2665a9537 32 665a9537b27749f2;
+  a8c06832398b5a70 68 0a8c06832398b5a7;
+  c1f9a7aba24b5516 25 25aa8b60fcd3d5d1;
+  1e51aaeb95e1e511 56 51aaeb95e1e5111e;
+  b3874faad48effe1 26 23bff86ce1d3eab5;
+  2dccf08b113a1f9e 52 cf08b113a1f9e2dc;
+  bb25b47f8968a082 17 50415d92da3fc4b4;
+  ab4008222c8c03df 48 08222c8c03dfab40;
+  213ba7e1412f9995 49 d3f0a097ccca909d;
+  c8123ef89b66074e 52 23ef89b66074ec81;
+  b502e2eacd8d74c2 45 17566c6ba615a817;
+  26887b8c874ad75e 26 d2b5d789a21ee321;
+  872a6e980a11947c 46 ba60284651f21ca9;
+  33b6ba72a81cf590 61 9db5d39540e7ac81;
+  faada6fe97c73242 65 7d56d37f4be39921;
+  24b1b85fe682cd1d 27 d059a3a496370bfc;
+  b833126cf9876424 66 2e0cc49b3e61d909;
+  c612844fb428dbc6 38 3ed0a36f1b184a11;
+  95238cb43653d3f5 16 d3f595238cb43653;
+  2aa1effa03c4cc3a 57 50f7fd01e2661d15;
+  fb97bbbf521b5864 41 dfa90dac327dcbdd;
+  baa395b5c7a7aa80 27 f4f550175472b6b8;
+  dfdb0984dc12ba2c 66 37f6c2613704ae8b;
+  11b39e4d85729892 13 c4908d9cf26c2b94;
+  2d986c78a311033b 49 363c5188819d96cc;
+  ba444d46e7503fd1  8 d1ba444d46e7503f;
+  686b7d7922fcf56b 47 faf245f9ead6d0d6;
+  b001ddd542907641 32 42907641b001ddd5;
+  3a327c960cf48973 32 0cf489733a327c96;
+  09ecc63d88b79c61 32 88b79c6109ecc63d;
+  f240e09c02002d31 32 02002d31f240e09c;
 }
 
 add64 {
-  9710b7bca91b612e 7fc5cc09f7f62f66 16d683c6a1119094;
-  23fcd2dec5de24d2 f2c839839c1b0631 16c50c6261f92b03;
-  687dbc68d9f07fd4 cb4f8cde8de201ec 33cd494767d281c0;
-  80332bbded4883de 0b58b54bdd13c17e 8b8be109ca5c455c;
-  92b0ded3caeb5e57 21df10bc6186265e b48fef902c7184b5;
-  ea45907de6cb822f ef953aea358a03e0 d9dacb681c55860f;
-  e2e1b9511bd332c8 67f123377a8f0256 4ad2dc889662351e;
-  dcc73ae1b3c6cd3f 4e3cb24284cfed17 2b03ed243896ba56;
-  1d64d492d39ea749 93a25b072945d83f b1072f99fce47f88;
-  3e66b0a6689cf096 003a8fca80e322a4 3ea14070e980133a;
-  bf050c1220450433 b6b6d8a2d820cf27 75bbe4b4f865d35a;
-  4b9d47f636845dac 7bb3e75f3a18fb8e c7512f55709d593a;
-  3416867fcd0ee78d 9236beec76d55ed5 c64d456c43e44662;
-  10f91d07a037791a 6e83c4bf2fb5b205 7f7ce1c6cfed2b1f;
-  92c172a5cbc19456 5c1bea6079f3867e eedd5d0645b51ad4;
-  d663cb3884b2a0a8 825df752423f3179 58c1c28ac6f1d221;
-  eb89eca385f20ddc f1f23564672e370f dd7c2207ed2044eb;
-  37d400a31e8aac1d 6ce10df73c5ee478 a4b50e9a5ae99095;
-  b63d91024780e974 a2a0e7a36f84ab12 58de78a5b7059486;
-  b627e7d01b38a84a e738721ed80fd0d7 9d6059eef3487921;
-  9fa658abb5a440d3 128719b541a9451c b22d7260f74d85ef;
-  d18e4c61d93d1f8f 5357442776739632 24e590894fb0b5c1;
-  3bf7d02cec050936 cec07591ada46227 0ab845be99a96b5d;
-  1d1519eedde0df37 30fe8c22ebd77705 4e13a611c9b8563c;
-  7b7e32ae88f45a34 ba3037235e19a394 35ae69d1e70dfdc8;
-  4d26ce47317d8087 4456b4cfc5555e92 917d8316f6d2df19;
-  3e7b2ebc829b2d05 ea617b0ca9531bcd 28dca9c92bee48d2;
-  6040d39040e632d5 643ccb6428630304 c47d9ef4694935d9;
-  caf679e914eaddc0 f8843ce6a427b99a c37ab6cfb912975a;
-  c266de31c0916523 eefe4b58cc034b9f b165298a8c94b0c2;
-  9f04678c2a9da898 9324cd3087a65101 322934bcb243f999;
-  6796f9c4881d89e1 e62221e47e57badd 4db91ba9067544be;
-  8d490c2f320ff8fb 42761bd439f3e96d cfbf28036c03e268;
-  ed1d5b2169912af1 e2c533c52ba3e8c7 cfe28ee6953513b8;
-  23a089e231480aa6 484fb34bd522397f 6bf03d2e066a4425;
-  2cb8ecf4f64e3298 fe73be257a753b38 2b2cab1a70c36dd0;
-  0bc23f94a079bde2 98d813655dafa15b a49a52f9fe295f3d;
-  419d15c41a5153cc d0e8c8702db2ba11 1285de3448040ddd;
-  7589678d4f7b8fcf 4818c411f15f4523 bda22b9f40dad4f2;
-  903874f9a532ee46 6ae753a2340af7b9 fb1fc89bd93de5ff;
-  9632fc5ae71ae18b de751ab6b6761ca1 74a817119d90fe2c;
-  34a9935e466e11c1 072f32a59c313dba 3bd8c603e29f4f7b;
-  b646ae909a096697 a7b0556463ff1126 5df703f4fe0877bd;
-  c43263391424d027 d0787e804d8f1dcc 94aae1b961b3edf3;
-  c897a8a484313243 041b5302ccd501b5 ccb2fba7510633f8;
-  bd03d5cb5c90d1fd 7d2be187a787032c 3a2fb7530417d529;
-  ed900764ee4ce1d3 042c084f7d8c0c48 f1bc0fb46bd8ee1b;
-  7d6f1eabd0fd1ec2 88f26734d5c8d92d 066185e0a6c5f7ef;
-  873a8fe113090d40 ea4d28ff49f10ff5 7187b8e05cfa1d35;
-  adc258e091abd31b dd1735158f987659 8ad98df621444974;
-  acc6602da063aae0 2a199d3a4f37a5f0 d6dffd67ef9b50d0;
-  d216d2053a83b5d3 488ab0d2df631b28 1aa182d819e6d0fb;
-  cdfcf9fdd0f37de9 67179aeae82fe000 351494e8b9235de9;
-  428b297b553230a6 17fa0c1a233c9ebc 5a853595786ecf62;
-  4cba45b20543c540 1b9dbce078b87a15 685802927dfc3f55;
-  acf03897b95a3f37 9f6c5a5f2ae44a7d 4c5c92f6e43e89b4;
-  e9ba43a39089de20 70d0544b5151db0a 5a8a97eee1dbb92a;
-  e9769e8f2fc12c7f 9fab269a0056284a 8921c529301754c9;
-  7ffd4113a1cf43b5 bdce2d86dead83f5 3dcb6e9a807cc7aa;
-  56e9106bedf908db f1119f9700260ea9 47fab002ee1f1784;
-  9cc7232184d21715 ee8ca42e75614739 8b53c74ffa335e4e;
-  007f234fbcd86b0a f641a0449b6d9b0f f6c0c39458460619;
-  d1cb4a57a4d6f987 b0ade90aa1d81c4f 8279336246af15d6;
-  7b3734be301da3e2 e692629db57311f4 61c9975be590b5d6;
+  ffa31bbb318ee6c9 77886da9ed9bf217 772b89651f2ad8e0;
+  2503beebdc863e7a 5aec57d94fd2f508 7ff016c52c593382;
+  677d70bb3b80e18c 7251e6454c970deb d9cf57008817ef77;
+  f1c65a62b1b9026f 15719acbd61c7704 0737f52e87d57973;
+  960ba55948d612e3 d3486d5d49202d18 695412b691f63ffb;
+  99399c6c45e8c599 40dbf36af241f761 da158fd7382abcfa;
+  fb9eed6a0cd0f0f3 632d1f45b7754396 5ecc0cafc4463489;
+  e39647f1cfee6040 330d58d6cd78a424 16a3a0c89d670464;
+  7db21330002cb386 d4bca40e62371c6d 526eb73e6263cff3;
+  e1c7031eb74dfa95 b66359d2cbf149ff 982a5cf1833f4494;
+  2e45cd635e2fcf27 d2e59db3ca1e8e7b 012b6b17284e5da2;
+  ad63ea4c6925e11b 301c6631d719e7bd dd80507e403fc8d8;
+  9f0657cc8e6619ec c046ef1f44c964bb 5f4d46ebd32f7ea7;
+  69a9fe8470acbd94 b63bc903388de527 1fe5c787a93aa2bb;
+  50b83682b43c0cbe e5d7933cf398b6d1 368fc9bfa7d4c38f;
+  a67482fbdd55f104 dece9659b7ecb778 854319559542a87c;
+  492cab8935ed33bf dc821a09459bfb4a 25aec5927b892f09;
+  323a1a40e6201389 19236991a37cd95a 4b5d83d2899cece3;
+  2b7ffef363020062 d0acc63ba6d05b12 fc2cc52f09d25b74;
+  1db43d975099d082 f03fe29725e17c84 0df4202e767b4d06;
+  8801d09bbe4e85f7 c131099b7d08a054 4932da373b57264b;
+  ffb5584821a24134 d4e7b794483c13c3 d49d0fdc69de54f7;
+  dc096d1c5e1099ac 44430283fb5a02df 204c6fa0596a9c8b;
+  0184be162ac48b75 ec32f75040808056 edb7b5666b450bcb;
+  1e2f6b50326ca98c b15e551d75529eaf cf8dc06da7bf483b;
+  7365630d71159148 c7bef83555794918 3b245b42c68eda60;
+  f67af3372a5cbc05 96df32153c93ed4e 8d5a254c66f0a953;
+  430351e583fc19a9 5431a75d8cdbe2df 9734f94310d7fc88;
+  2519db4bbebb8ec9 36ea3d9c821c7ccd 5c0418e840d80b96;
+  1065e01360db5f60 1b7df81e5c04ed9a 2be3d831bce04cfa;
+  6c99a594ea6f81c4 a73fb16638a957bf 13d956fb2318d983;
+  3169420dd13fb427 f93dd859bb958ddd 2aa71a678cd54204;
+  916cbddf29aca294 151f8b3b6e14b136 a68c491a97c153ca;
+  c6110822a062efdc 48ccc81cf9eaef85 0eddd03f9a4ddf61;
+  bab5817a17ce5c7d 7db952939d68ad41 386ed40db53709be;
+  f3e534755d5253ad e8fe934c07a834ff dce3c7c164fa88ac;
+  145953602245c141 a5706669ba7fc566 b9c9b9c9dcc586a7;
+  8d0422a0a55011b9 2c57299ba1dbf17e b95b4c3c472c0337;
+  b53b86b676485d4e aec47d6ed6c1cfdb 640004254d0a2d29;
+  33abdb685054013e e42476b3652ffeed 17d0521bb584002b;
+  74e814305e87098f 012790b9c7b63825 760fa4ea263d41b4;
+  22fb3116e5d4261e 38f3bbc7aca807d9 5beeecde927c2df7;
+  7cc9f89cd170b899 ea665723ac1ebffc 67304fc07d8f7895;
+  a9adcf9792573201 792b40b628469eed 22d9104dba9dd0ee;
+  f672a26fdff77589 377176c791d6d05d 2de4193771ce45e6;
+  e40d2c2eedce7389 12e8a01a4a099c70 f6f5cc4937d80ff9;
+  43dc1e358b162ef4 96013eadfd569906 d9dd5ce3886cc7fa;
+  74abbe06e79609e2 a5ff7e7b394634e5 1aab3c8220dc3ec7;
+  0fd32f5d53cb1a59 d86f31434c46b912 e84260a0a011d36b;
+  a5c776d85f896e78 23af6c42d02bf636 c976e31b2fb564ae;
+  e86e5c9dd566720b d965d3bb8ace6968 c1d430596034db73;
+  6d143e937ce97f11 4c7870a4590fe308 b98caf37d5f96219;
+  69c015fc03df474a ef039a618bad49da 58c3b05d8f8c9124;
+  c4e978b498b30f5b df9e8f05bd0da330 a48807ba55c0b28b;
+  3087b6a9bc6e194b b83e25210ff7ff77 e8c5dbcacc6618c2;
+  b3093e95f655c4ce a7ee958e7c34c023 5af7d424728a84f1;
+  8551c621019d03f8 05eb84dfbc033b4f 8b3d4b00bda03f47;
+  aa87ba7cefdec2ce 866a37ad34319550 30f1f22a2410581e;
+  86e9a1e9b538b043 09b50be0769ab77e 909eadca2bd367c1;
+  8e1192fa83d9fad8 0f63d3d397206f04 9d7566ce1afa69dc;
+  bda0d57ae405c719 9d821e8c88b126fe 5b22f4076cb6ee17;
+  1bb5139aaaf14309 68a929926b06207c 845e3d2d15f76385;
+  8c47736195bb45e9 458ca5c5dfbeb93f d1d419277579ff28;
+  83b0705883ec36cf f87381fd47cfa1b0 7c23f255cbbbd87f;
 }
 
 sub64 {
-  f3a1573f9e0553a2 96265e4326fa532d 5d7af8fc770b0075;
-  36863e5b4bc6c99a 3d4eb23cacdf6e42 f9378c1e9ee75b58;
-  8ca13187eba15329 ba31582b3793b05f d26fd95cb40da2ca;
-  5e9f80c5814b91f4 c581c7b16c46b484 991db9141504dd70;
-  9c6d19eebaf12468 a3be9943307fa4ef f8ae80ab8a717f79;
-  5ef8e7e50b703dc0 0e74227c9351366e 5084c568781f0752;
-  e98e1e24b48aa989 b8d0f10471ae5428 30bd2d2042dc5561;
-  012fbe4f5cb2dab2 3e574842cc0b3774 c2d8760c90a7a33e;
-  0dcfa63b0db1716c 916a26fc2e198f8d 7c657f3edf97e1df;
-  3ab5995598949778 16c5816270ef3fbe 23f017f327a557ba;
-  a22f484ddc12ec8f dbd6ebdfbafb21fc c6585c6e2117ca93;
-  427dbee5f95b53a0 cb6d7c128b79f465 771042d36de15f3b;
-  95f4b0ba518dd614 140f20d40224baac 81e58fe64f691b68;
-  602da83cb254a7e0 052c63c1f3f00f30 5b01447abe6498b0;
-  c944a1789133bb80 f07dc123f2ca7e20 d8c6e0549e693d60;
-  3988e4bfea6d561a aea542db544a1437 8ae3a1e4962341e3;
-  5d52f7265c7a8d2f feef99b9dba89eb4 5e635d6c80d1ee7b;
-  f71d8eb5affe900d 6e4cf74e52b6c86d 88d097675d47c7a0;
-  81143082735c6473 6a5da3d2e8cbb860 16b68caf8a90ac13;
-  bbaf08bf9315fba1 46714bfd2c8312fb 753dbcc26692e8a6;
-  44dfe84615ddb93f 360161f2efb1fc39 0ede8653262bbd06;
-  b6ad97427dcaa043 ee7f3a5c11fd01b9 c82e5ce66bcd9e8a;
-  20aa6004f84bcba8 a1c33beb40877191 7ee72419b7c45a17;
-  b355dce9ffd6fd63 192e4c2c9a2752bf 9a2790bd65afaaa4;
-  a3f63408d3b27df5 44ed5537bfb0162f 5f08ded1140267c6;
-  edbad1b2c36ceec1 407475b8e05fcb5e ad465bf9e30d2363;
-  6c7205f21804c3b7 51dc9a3aed7667c6 1a956bb72a8e5bf1;
-  2c8355ff66b91eef 115cf118eef301f2 1b2664e677c61cfd;
-  3fda303878f79871 dba62d93a7da7027 643402a4d11d284a;
-  fe5a6506e4e1439d 6cc9d332ab03510d 919091d439ddf290;
-  c7d35dc526b5b778 00f53d34b5d55fca c6de209070e057ae;
-  fbeadd81456bbe6b db015be40bfbda65 20e9819d396fe406;
-  83b32fc4d0a9dc2d 68b134919d79de52 1b01fb33332ffddb;
-  d7d2ce372a8a386a 18d09e19612f3d10 bf02301dc95afb5a;
-  569863bbd3ad4290 05058b934eb213aa 5192d82884fb2ee6;
-  7de4e26cd4ceff74 353b5e7621d67ee3 48a983f6b2f88091;
-  fb2584e1e12d071c 13ec9e9d8df16478 e738e644533ba2a4;
-  74776ee19eb0a867 1ae63292af9ac5ff 59913c4eef15e268;
-  a00ad546e4424276 71d3eb06dd35f064 2e36ea40070c5212;
-  6faabf49e029cd11 92f72ee0136f6237 dcb39069ccba6ada;
-  7451ac5e45b31f52 5dfa0fffa3a02cbc 16579c5ea212f296;
-  28b379377d47b693 40b6860a580392ea e7fcf32d254423a9;
-  14124aeb050d5180 280f3ee47335af18 ec030c0691d7a268;
-  6dcc543e48b8c731 116207607f2dc83b 5c6a4cddc98afef6;
-  119be8284f3ab482 60886e4d3bf414f4 b11379db13469f8e;
-  d3933f1226ff1eec b27749f2665a9537 211bf51fc0a489b5;
-  0aa8c06832398b5a ae3761254ce7df3f 5c715f42e551ac1b;
-  ec77f57d5fd5445c 4f92c1f9a7aba24b 9ce53383b829a211;
-  161f7a1e51aaeb95 e5114c8d4ea8a927 310e2d910302426e;
-  7fb15362b3874faa 8effe14cba2dccf0 f0b17215f95982ba;
-  113a1f9ea45754f5 a4021910a37b39a1 6d38068e00dc1b54;
-  a1d04c460edcbb25 7f8968a082fd4cab 2246e3a58bdf6e7a;
-  08222c8c03df281f 1a9cdb9c716eac55 ed8550ef92707bca;
-  2b93376b49e45f76 3ba7e1412f9995d5 efeb562a1a4ac9a1;
-  c8123ef89b66074e 1fc86dc716a338f3 a849d13184c2ce5b;
-  8137bbc1617fa73a eeb502e2eacd8d74 9282b8de76b219c6;
-  1f41366f5ed56596 e29c26887b8c874a 3ca50fe6e348de4c;
-  5eb2dfcb6c5d8548 cb7d9dd25d4785d4 933541f90f15ff74;
-  14fcc3420b38dd59 285a12872a6e980a eca2b0bae0ca454f;
-  947c88bb4377e961 73edd403e194b4e1 208eb4b761e33480;
-  5e882077d57df101 3f0ef48633b6ba72 1f792bf1a1c7368f;
-  1cf5907723679665 90fdd70388faada6 8bf7b9739a6ce8bf;
-  97c732422deb93de d096546a685a24b1 c730ddd7c5916f2d;
-  5fe682cd1dd314b8 126cf98764248650 4d798945b9ae8e68;
+  840f33a93043b3b8 3f8c5b4675f8dc37 4482d862ba4ad781;
+  01d52c8258029c24 f46d6b5d3447d076 0d67c12523bacbae;
+  9b76805d62cddc3c 95780d2a4333b49e 05fe73331f9a279e;
+  e45991918d826254 21765e775ed435ec c2e3331a2eae2c68;
+  0cb384f3ea92338e 1c406099f48452f3 f0732459f60de09b;
+  05fe731bdaf80c62 7c3c6e37f7280c06 89c204e3e3d0005c;
+  12aa89841e7cf25f 8d11297468360e6f 8599600fb646e3f0;
+  4f13686c9fca96fc 50237a657a0c851d feefee0725be11df;
+  3b8cb60ea1a95b2b 488d12ee7745ee29 f2ffa3202a636d02;
+  8af1ccd5901a5412 bcaac1ee8639e9db ce470ae709e06a37;
+  42ae568070a2f527 0c06e9aedbeea1a7 36a76cd194b45380;
+  e9db048fe53412d0 115b14082a737f4f d87ff087bac09381;
+  57a1ded3be8d6228 0b7c9162889ab350 4c254d7135f2aed8;
+  9400e5e98eb4e953 a25ec65e79b8c991 f1a21f8b14fc1fc2;
+  15b3c653aee0aa03 794ed82d5120ee49 9c64ee265dbfbbba;
+  5c76f984993259f8 0edc054bd7c3d63f 4d9af438c16e83b9;
+  fa34e470ca2462ed dbbb8ecbab916c5c 1e7955a51e92f691;
+  56d8006738fa669a b5322e4a0abbf298 a1a5d21d2e3e7402;
+  e437f41bd175469e c26093f2ff5936b5 21d76028d21c0fe9;
+  ba02725ec00e044e 7ffc5de81723faa9 3a061476a8ea09a5;
+  f5ae1def086a31fa 66d1256c07ec03b2 8edcf883007e2e48;
+  e282a1f1abdd0bd3 720053262c99ce85 70824ecb7f433d4e;
+  abefa13cc1b083ee f34d3455c4e73e21 b8a26ce6fcc945cd;
+  e36fd6df5d3e80da 8e7468fdecd51cf7 54fb6de1706963e3;
+  53508bb42f9fb12d bbbf874db4fc1d93 979104667aa3939a;
+  a08c4fff0cb126cd db33a2d5b6244f85 c558ad29568cd748;
+  60342f111b96e944 da0d834e0981f0fb 8626abc31214f849;
+  29bb2238436d3d5c 0cc0d6c0d7dc0122 1cfa4b776b913c3a;
+  d4e4b492d0144d0a 216312d86999de02 b381a1ba667a6f08;
+  62aa21d058b04793 ca967ac4e15d8ea0 9813a70b7752b8f3;
+  7c7559b4c2d33eab 6ba7002f0cdb3b17 10ce5985b5f80394;
+  cee3365083ac9b0a f78716ffb3dc1bee d75c1f50cfd07f1c;
+  beff21f4be58cac5 39468a2ba0e2993a 85b897c91d76318b;
+  f68c3b001544ee50 45e03f4db3071561 b0abfbb2623dd8ef;
+  be6bb80aef13d9b7 d6d3430f44d09daa e79874fbaa433c0d;
+  0ef5bc1d106176a2 5e285963e24cb86c b0cd62b92e14be36;
+  2f5541b5ef1f653d dba0b770766c5a13 53b48a4578b30b2a;
+  12398a5bca95d24f 0687b4560a76287f 0bb1d605c01fa9d0;
+  6772fa6d8e350eea 0194bcc240fb19ad 65de3dab4d39f53d;
+  6169ae1bacec540e c6af706b81647983 9aba3db02b87da8b;
+  fea76d131a869677 0c4f71cd9468c166 f257fb45861dd511;
+  b2e08ee794cb1de9 631b1a5239d80768 4fc574955af31681;
+  c5f5d16f81d09e34 c95a7a8d545dc794 fc9b56e22d72d6a0;
+  078d1f0f0130311b b1063d557b31dd54 5686e1b985fe53c7;
+  50de5365dd81df94 4a91eea0b3722175 064c64c52a0fbe1f;
+  3792c2eafa6233cc c658e0b8768dcb70 7139e23283d4685c;
+  27e0384677309813 5beba6be23ed8205 cbf491885343160e;
+  8f94e209fdbf838c aa4a6aa7696b7c16 e54a776294540776;
+  4e4853557845c317 c2cdc5fb5ad60d9d 8b7a8d5a1d6fb57a;
+  479e93740c3b0dcb fa6a10a7b62fd2c7 4d3482cc560b3b04;
+  26118c18862e3577 c1e1c80cbba574c1 642fc40bca88c0b6;
+  880bbe893abbc412 a0876b0c6551dbc0 e784537cd569e852;
+  02685dcb638d3852 cd78ce98851931c5 34ef8f32de74068d;
+  783ed0fbfb0514b9 cc25a09cd136eac6 ac19305f29ce29f3;
+  0edd1bbe299d0576 74a19f3cc23ebb6a 9a3b7c81675e4a0c;
+  8fc2889d6cfd2702 f57ada42c026133f 9a47ae5aacd713c3;
+  add9376cee2976e5 62724f7364acd2a1 4b66e7f9897ca444;
+  224fe89bdc5eaa00 e9d1d88442f98f77 387e101799651a89;
+  e41daa2fabef0312 68145366042b11c2 7c0956c9a7c3f150;
+  0bfb4f1a4bec61a3 08e848bbf1ee1264 0313065e59fe4f3f;
+  26b7ab0259e30390 93b750a91adc862a 93005a593f067d66;
+  3d21201fb7e0e828 a8e8b735f372e772 943868e9c46e00b6;
+  8cfc5c2cbf62304b 2868e4e22d000239 6493774a92622e12;
+  d4fc83506a7d0850 49f4d713dad4992d 8b07ac3c8fa86f23;
 }