├── Dataset ├── adult_data.p ├── kddcup98_data_70k.p └── kddcup99_data_70k.p ├── Distributed Learning Without Distress.pdf ├── Inputs ├── beta1.txt ├── beta2.txt ├── intercepts.txt └── random_vals.txt ├── Output └── beta_avg.txt ├── README.md ├── fixed.c ├── fixed.h ├── model_aggregate_gaussian ├── Makefile ├── modelAggregate.c ├── modelAggregate.oc └── modelAggregate.oh ├── model_aggregate_laplace ├── Makefile ├── modelAggregate.c ├── modelAggregate.oc └── modelAggregate.oh ├── model_wrapper.py ├── ofixed.oc ├── ofixed.oh ├── ofixed_constants.h ├── ofixed_constants.h.template ├── util.c ├── util.h └── utility.py /Dataset/adult_data.p: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bargavj/distributedMachineLearning/60566949f38b71bcc3ae2e3837b11c2f10e19fe4/Dataset/adult_data.p -------------------------------------------------------------------------------- /Dataset/kddcup98_data_70k.p: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bargavj/distributedMachineLearning/60566949f38b71bcc3ae2e3837b11c2f10e19fe4/Dataset/kddcup98_data_70k.p -------------------------------------------------------------------------------- /Dataset/kddcup99_data_70k.p: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bargavj/distributedMachineLearning/60566949f38b71bcc3ae2e3837b11c2f10e19fe4/Dataset/kddcup99_data_70k.p -------------------------------------------------------------------------------- /Distributed Learning Without Distress.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bargavj/distributedMachineLearning/60566949f38b71bcc3ae2e3837b11c2f10e19fe4/Distributed Learning Without Distress.pdf -------------------------------------------------------------------------------- /Inputs/intercepts.txt: -------------------------------------------------------------------------------- 1 | [-3.87079992] -------------------------------------------------------------------------------- /Output/beta_avg.txt: -------------------------------------------------------------------------------- 1 | 2.13961722 1.12891838 2.90760012 8.80058607 2.55281334 2.05218709 1.13324539 0.45730139 0.74307394 0.90201406 0.28390185 0.40266818 0.08210792 0.08489624 0.13157431 0.01465345 0.32201464 0.25577682 -0.06452980 -0.06715192 0.03910674 0.07934393 0.30094242 0.88894601 -0.08997134 0.71191087 0.37211432 0.98061254 0.04407306 0.36299302 0.29029353 1.38898621 0.60030902 0.34820283 0.52209351 0.49143445 0.27833687 0.00198612 0.19678516 1.03877642 -0.29808242 -0.01495966 -0.03565690 0.18178852 0.15285093 0.73713342 0.56036056 0.52361940 0.66457155 0.01680211 1.02825126 0.25445426 0.36351823 0.48289435 0.29277956 1.58241465 0.59927266 0.94690730 0.87489233 0.63330251 0.94993767 1.84051214 2.16380043 0.15495304 0.64829688 -0.08676233 -0.16309702 0.09251157 0.10501337 0.14833008 0.08820914 0.26994160 0.04598741 0.37925423 0.06131434 0.20703230 0.02796219 -0.00000013 0.04747564 -0.06259511 0.03540360 0.31546916 0.12653642 0.18392747 0.20404309 0.12038584 0.19084185 -0.08465132 0.07087645 -0.02164297 -0.05116422 0.02808948 0.43715209 0.09828318 0.15351746 0.05754612 -0.14372281 -0.16620621 -0.00930797 0.00337377 -0.02978781 0.44467162 -0.06998904 0.14684120 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Distributed Privacy-Preserving Empirical Risk Minimization 2 | This work combines differential privacy and multi-party computation protocol to achieve distributed machine learning. Based on the paper "Distributed Learning without Distress: Privacy-Preserving Empirical Risk Minimization" (http://papers.nips.cc/paper/7871-distributed-learning-without-distress-privacy-preserving-empirical-risk-minimization) that has been accepted at NIPS 2018. 3 | 4 | The code contains privacy preserving implementation of L2 Regularized Logistic Regression and Linear Regression models. 5 | 6 | ### Requirements 7 | 8 | * Python 2.7 or above 9 | * [Numpy](https://numpy.org) 10 | * [Scikit Learn](https://scikit-learn.org/stable/) 11 | * [Obliv-C](https://github.com/samee/obliv-c) 12 | * [Absentminded Crypto Toolkit](https://bitbucket.org/jackdoerner/absentminded-crypto-kit/src/master/) 13 | * [Cycle Utility](https://github.com/samee/cmd) 14 | 15 | ### Code Execution 16 | 17 | Execute make files in `model_aggregate_gaussian` and `model_aggregate_laplace` directories using `make` command to obtain the respective `a.out` executable files. 18 | 19 | Run `python model_wrapper.py` 20 | -------------------------------------------------------------------------------- /fixed.c: -------------------------------------------------------------------------------- 1 | #include "fixed.h" 2 | 3 | fixed_t double_to_fixed(double d, int p) { 4 | return (fixed_t) (d * (1LL << p)); 5 | } 6 | 7 | double fixed_to_double(fixed_t f, int p) { 8 | return (double)(((long double) f) / (1LL << p)); 9 | } 10 | 11 | -------------------------------------------------------------------------------- /fixed.h: -------------------------------------------------------------------------------- 1 | #ifndef FIXED_OH 2 | #define FIXED_OH 3 | 4 | #include 5 | 6 | #if BIT_WIDTH_32 7 | #define FIXED_BIT_SIZE 32 8 | typedef int32_t fixed_t; 9 | typedef uint32_t ufixed_t; 10 | #else 11 | #define FIXED_BIT_SIZE 64 12 | typedef int64_t fixed_t; 13 | typedef uint64_t ufixed_t; 14 | #endif 15 | 16 | fixed_t double_to_fixed(double d, int p); 17 | double fixed_to_double(fixed_t f, int p); 18 | 19 | #endif -------------------------------------------------------------------------------- /model_aggregate_gaussian/Makefile: -------------------------------------------------------------------------------- 1 | testName=modelAggregate 2 | 3 | CILPATH=~/obliv-c 4 | ACKPATH=~/absentminded-crypto-kit 5 | CODEPATH=~/distributedMachineLearning 6 | REMOTE_HOST=localhost 7 | CFLAGS=-DREMOTE_HOST=$(REMOTE_HOST) -O3 8 | ./a.out: $(testName).oc $(testName).c $(CODEPATH)/util.c $(ACKPATH)/build/lib/liback.a $(CILPATH)/_build/libobliv.a 9 | $(CILPATH)/bin/oblivcc $(CFLAGS) -I . -I $(ACKPATH)/src/ $(testName).oc $(testName).c $(CODEPATH)/util.c $(ACKPATH)/src/obig.oc $(CODEPATH)/ofixed.oc -lm 10 | clean: 11 | rm -f a.out 12 | -------------------------------------------------------------------------------- /model_aggregate_gaussian/modelAggregate.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "modelAggregate.oh" 6 | 7 | int main(int argc, char *argv[]) { 8 | ProtocolDesc pd; // Protocol Descriptor used for passing message between the parties 9 | protocolIO io; // Data structure to store the input parameters 10 | double start, end; // Variables to measure start and end time of Wall Clock 11 | int party; // CommandLine Argument: 1 -> Generator and 2 -> Evaluator 12 | FILE *fptr1, *fptr2, *fptr3, *fptr4, *fptr5, *fptr6, *fptr7, *fptr8, *fptr9; 13 | int i, j, bytes; 14 | char c[20]; 15 | int M, D; 16 | 17 | if (strcmp(argv[2], "--") == 0) { 18 | party = 1; 19 | } else { 20 | party = 2; 21 | } 22 | 23 | M = atoi(argv[4]); 24 | D = atoi(argv[5]); 25 | io.M = M; 26 | io.D = D; 27 | io.beta1 = (int64_t **)malloc(M * sizeof(int64_t *)); 28 | io.random11 = (int64_t *)malloc(D * sizeof(int64_t)); 29 | io.random21 = (int64_t *)malloc(D * sizeof(int64_t)); 30 | io.beta2 = (int64_t **)malloc(M * sizeof(int64_t *)); 31 | io.random12 = (int64_t *)malloc(D * sizeof(int64_t)); 32 | io.random22 = (int64_t *)malloc(D * sizeof(int64_t)); 33 | for(i = 0; i < M; i++) { 34 | io.beta1[i] = (int64_t *)malloc(D * sizeof(int64_t)); 35 | io.beta2[i] = (int64_t *)malloc(D * sizeof(int64_t)); 36 | } 37 | io.beta_avg = (int64_t *)malloc(D * sizeof(int64_t)); 38 | 39 | if(party == 1) { 40 | fptr1=fopen("Inputs/beta1.txt","r"); 41 | for(i = 0; i < M; i++) { 42 | for(j = 0; j < D; j++) { 43 | bytes = fscanf(fptr1,"%s", c); 44 | io.beta1[i][j] = atoll(c); 45 | } 46 | } 47 | fclose(fptr1); 48 | fptr2=fopen("Inputs/noise1.txt","r"); 49 | bytes = fscanf(fptr2,"%s", c); 50 | io.noise1 = atoll(c); 51 | fclose(fptr2); 52 | fptr3=fopen("Inputs/random11.txt","r"); 53 | for(i = 0; i < D; i++) { 54 | bytes = fscanf(fptr3,"%s", c); 55 | io.random11[i] = atoll(c); 56 | } 57 | fclose(fptr3); 58 | fptr4=fopen("Inputs/random21.txt","r"); 59 | for(i = 0; i < D; i++) { 60 | bytes = fscanf(fptr4,"%s", c); 61 | io.random21[i] = atoll(c); 62 | } 63 | fclose(fptr4); 64 | } 65 | 66 | if(party == 2) { 67 | fptr5=fopen("Inputs/beta2.txt","r"); 68 | for(i = 0; i < M; i++) { 69 | for(j = 0; j < D; j++) { 70 | bytes = fscanf(fptr5,"%s", c); 71 | io.beta2[i][j] = atoll(c); 72 | } 73 | } 74 | fclose(fptr5); 75 | fptr6=fopen("Inputs/noise2.txt","r"); 76 | bytes = fscanf(fptr6,"%s", c); 77 | io.noise2 = atoll(c); 78 | fclose(fptr6); 79 | fptr7=fopen("Inputs/random12.txt","r"); 80 | for(i = 0; i < D; i++) { 81 | bytes = fscanf(fptr7,"%s", c); 82 | io.random12[i] = atoll(c); 83 | } 84 | fclose(fptr7); 85 | fptr8=fopen("Inputs/random22.txt","r"); 86 | for(i = 0; i < D; i++) { 87 | bytes = fscanf(fptr8,"%s", c); 88 | io.random22[i] = atoll(c); 89 | } 90 | fclose(fptr8); 91 | sleep(1); 92 | } 93 | 94 | setCurrentParty(&pd, party); 95 | 96 | const char* remote_host = (strcmp(argv[2], "--") == 0 ? NULL : argv[2]); 97 | ocTestUtilTcpOrDie(&pd, remote_host, argv[1]); 98 | 99 | if (strcmp(argv[3], "yao") == 0) { 100 | io.proto = 1; 101 | } else if (strcmp(argv[3], "dualex") == 0) { 102 | io.proto = 2; 103 | } else { 104 | io.proto = 0; 105 | } 106 | 107 | start = wallClock(); 108 | 109 | if (io.proto == 1) { 110 | execYaoProtocol(&pd, aggregate, &io); 111 | } else { 112 | execDualexProtocol(&pd, aggregate, &io); 113 | } 114 | 115 | end = wallClock(); 116 | 117 | fprintf(stderr, "\nParty %d, Elapsed Time: %f seconds \n", party, end - start); 118 | 119 | if (party == 1) { 120 | fptr9=fopen("Output/beta_avg.txt","w"); 121 | for(i = 0; i < D; i++) 122 | fprintf(fptr9, "%.8f ", io.beta_avg[i]*1.0/SCALE); 123 | fclose(fptr9); 124 | } 125 | 126 | for(i = 0; i < M; i++) { 127 | free(io.beta1[i]); 128 | free(io.beta2[i]); 129 | } 130 | free(io.beta1); 131 | free(io.random11); 132 | free(io.random21); 133 | free(io.beta_avg); 134 | free(io.beta2); 135 | free(io.random12); 136 | free(io.random22); 137 | 138 | cleanupProtocol(&pd); 139 | 140 | if(io.correct == 0) { 141 | return 1; 142 | } 143 | 144 | return 0; 145 | } 146 | -------------------------------------------------------------------------------- /model_aggregate_gaussian/modelAggregate.oc: -------------------------------------------------------------------------------- 1 | #include "modelAggregate.oh" 2 | 3 | void aggregate(void* args) 4 | { 5 | protocolIO *io = args; 6 | obliv bool correct; 7 | obliv int64_t *beta_avg, noise_scale, u1, u2, v2, noise, log_u1, log_max, max, factor; 8 | obig log_max_big, log_u1_big, max_big, u1_big, u2_big, v2_big, noise_big, noise_sq_big, tmp, factor_big; 9 | int64_t prec; 10 | int M, D; 11 | 12 | obig_init(&log_u1_big, MAXN); 13 | obig_init(&log_max_big, MAXN); 14 | obig_init(&max_big, MAXN); 15 | obig_init(&u1_big, MAXN); 16 | obig_init(&u2_big, 2*MAXN); 17 | obig_init(&v2_big, MAXN); 18 | obig_init(&factor_big, MAXN); 19 | obig_init(&noise_big, MAXN); 20 | obig_init(&tmp, MAXN); 21 | obig_init(&noise_sq_big, 2*MAXN); 22 | 23 | correct = 1; 24 | factor = 85776388; 25 | max = SCALE; 26 | 27 | obig *log_u1_big_ref = &log_u1_big; 28 | obig *u2_big_ref = &u2_big; 29 | obig *v2_big_ref = &v2_big; 30 | obig *noise_big_ref = &noise_big; 31 | obig *tmp_ref = &tmp; 32 | 33 | M = io->M; 34 | D = io->D; 35 | beta_avg = (obliv int64_t *)malloc(D * sizeof(obliv int64_t)); 36 | 37 | noise_scale = (feedOblivLLong(io->noise1, 1) ^ feedOblivLLong(io->noise2, 2)); 38 | 39 | for(int j = 0; j < D; j++) 40 | { 41 | beta_avg[j] = 0; 42 | u1 = (feedOblivLLong(io->random11[j], 1) ^ feedOblivLLong(io->random12[j], 2)); 43 | v2 = (feedOblivLLong(io->random21[j], 1) ^ feedOblivLLong(io->random22[j], 2)); 44 | for(int i = 0; i < M; i++) { 45 | beta_avg[j] += (feedOblivLLong(io->beta1[i][j], 1) ^ feedOblivLLong(io->beta2[i][j], 2)); 46 | } 47 | beta_avg[j] /= M; 48 | 49 | //u2 = (2 * v2 - SCALE) * factor / SCALE; 50 | //u2 = 2 * v2 - SCALE; 51 | 52 | obig_import_onative(&u1_big, u1); 53 | obig_import_onative(&v2_big, v2); 54 | obig_import_onative(&factor_big, factor); 55 | obig_import_onative(&max_big, max); 56 | 57 | obig_add_signed(v2_big_ref, v2_big, v2_big); 58 | obig_sub_signed(v2_big_ref, v2_big, max_big); 59 | 60 | obig_mul_signed(u2_big_ref, v2_big, factor_big); 61 | 62 | //noise = u2 / u1; 63 | obig_div_mod_signed(&noise_big, &tmp, u2_big, u1_big); 64 | 65 | noise = obig_export_onative_signed(noise_big); 66 | 67 | obig_div_mod_signed(noise_big_ref, tmp_ref, noise_big, max_big); 68 | 69 | obig_mul_signed(&noise_sq_big, noise_big, noise_big); 70 | 71 | ofixed_ln(&log_u1_big, &prec, u1_big, 0); 72 | log_u1 = obig_export_onative_signed(log_u1_big); 73 | log_u1 /= (1LL << prec); 74 | 75 | 76 | ofixed_ln(&log_max_big, &prec, max_big, 0); 77 | log_max = obig_export_onative_signed(log_max_big); 78 | log_max /= (1LL << prec); 79 | 80 | log_u1 = 4 * (log_max - log_u1); 81 | obig_import_onative(log_u1_big_ref, log_u1); 82 | 83 | //if(u2 * u2 > -4 * u1 * u1 * log_u1) 84 | obliv if(obig_cmp(noise_sq_big, log_u1_big) > 0) { 85 | correct = 0; 86 | } 87 | 88 | obig_import_onative(noise_big_ref, noise); 89 | 90 | obig_import_onative(u2_big_ref, noise_scale); 91 | obig_mul_signed(u2_big_ref, noise_big, u2_big); 92 | obig_div_mod_signed(noise_big_ref, tmp_ref, u2_big, max_big); 93 | noise = obig_export_onative_signed(noise_big); 94 | 95 | beta_avg[j] += noise; 96 | } 97 | printGateCount(); 98 | 99 | revealOblivBool(&io->correct, correct, 0); 100 | for(int j = 0; j < D; j++) { 101 | revealOblivLLong(&io->beta_avg[j], beta_avg[j], 1); 102 | } 103 | 104 | obig_free(&u1_big); 105 | obig_free(&u2_big); 106 | obig_free(&v2_big); 107 | obig_free(&max_big); 108 | obig_free(&noise_big); 109 | obig_free(&noise_sq_big); 110 | obig_free(&tmp); 111 | obig_free(&log_max_big); 112 | obig_free(&log_u1_big); 113 | 114 | free(beta_avg); 115 | } 116 | -------------------------------------------------------------------------------- /model_aggregate_gaussian/modelAggregate.oh: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_AGGREGATE_OH 2 | #define MODEL_AGGREGATE_OH 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "ofixed.oh" 9 | #include "util.h" 10 | 11 | #define MAXN 9 12 | //#define D 22 // 123 a9a, 22 ijcnn1 13 | //#define M 5 14 | #define SCALE 1000000000 15 | 16 | #define printGateCount() fprintf(stderr, "Yao gate count: %llu\n", yaoGateCount()) 17 | 18 | typedef struct protocolIO{ 19 | int64_t **beta1; // Model Parameters Share of Party 1 20 | int64_t **beta2; // Model Parameters Share of Party 2 21 | int64_t *beta_avg; // Aggregate Model Parameters 22 | int64_t noise1; // Noise Scale Share of Party 1 23 | int64_t noise2; // Noise Scale Share of Party 2 24 | int64_t *random11; // Random Noise Share of Party 1 25 | int64_t *random12; // Random Noise Share of Party 2 26 | int64_t *random21; // Random Noise Share of Party 1 27 | int64_t *random22; // Random Noise Share of Party 2 28 | int proto; // CommandLine Argument: 1 -> Yao and 2 -> DualEx 29 | bool correct; 30 | int M, D; 31 | }protocolIO; 32 | 33 | void aggregate(void* args); 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /model_aggregate_laplace/Makefile: -------------------------------------------------------------------------------- 1 | testName=modelAggregate 2 | 3 | CILPATH=~/obliv-c 4 | ACKPATH=~/absentminded-crypto-kit 5 | CODEPATH=~/distributedMachineLearning 6 | REMOTE_HOST=localhost 7 | CFLAGS=-DREMOTE_HOST=$(REMOTE_HOST) -O3 8 | ./a.out: $(testName).oc $(testName).c $(CODEPATH)/util.c $(ACKPATH)/build/lib/liback.a $(CILPATH)/_build/libobliv.a 9 | $(CILPATH)/bin/oblivcc $(CFLAGS) -I . -I $(ACKPATH)/src/ $(testName).oc $(testName).c $(CODEPATH)/util.c $(ACKPATH)/src/obig.oc $(CODEPATH)/ofixed.oc -lm 10 | clean: 11 | rm -f a.out 12 | -------------------------------------------------------------------------------- /model_aggregate_laplace/modelAggregate.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "modelAggregate.oh" 5 | 6 | int main(int argc, char *argv[]) { 7 | ProtocolDesc pd; // Protocol Descriptor used for passing message between the parties 8 | protocolIO io; // Data structure to store the input parameters 9 | double start, end; // Variables to measure start and end time of Wall Clock 10 | int party; // CommandLine Argument: 1 -> Generator and 2 -> Evaluator 11 | FILE *fptr1, *fptr2, *fptr3, *fptr4; 12 | int i, j, bytes; 13 | char c[20]; 14 | 15 | if (strcmp(argv[2], "--") == 0) { 16 | party = 1; 17 | } else { 18 | party = 2; 19 | } 20 | 21 | if(party == 1) { 22 | fptr1=fopen("Inputs/beta1.txt","r"); 23 | for(i = 0; i < M; i++) { 24 | for(j = 0; j < D; j++) { 25 | bytes = fscanf(fptr1,"%s", c); 26 | io.beta1[i][j] = atoll(c); 27 | } 28 | } 29 | fclose(fptr1); 30 | } 31 | if(party == 2) { 32 | fptr2=fopen("Inputs/beta2.txt","r"); 33 | for(i = 0; i < M; i++) { 34 | for(j = 0; j < D; j++) { 35 | bytes = fscanf(fptr2,"%s", c); 36 | io.beta2[i][j] = atoll(c); 37 | } 38 | } 39 | fclose(fptr2); 40 | } 41 | 42 | fptr3=fopen("Inputs/random_vals.txt","r"); 43 | for(i = 0; i < M; i++) { 44 | for(j = 0; j < D; j++) { 45 | bytes = fscanf(fptr3,"%s", c); 46 | io.random_vals[i][j] = atoll(c); 47 | } 48 | } 49 | fclose(fptr3); 50 | 51 | for(i = 0; i < M; i++) { 52 | io.sizes[i] = 300; 53 | } 54 | 55 | io.epsilon = 0.5; 56 | io.lambda = 0.00316227766;//0.00316227766;// 10^-2.5//0.03162277660168379; // 10^-1.5 57 | 58 | setCurrentParty(&pd, party); 59 | 60 | const char* remote_host = (strcmp(argv[2], "--") == 0 ? NULL : argv[2]); 61 | ocTestUtilTcpOrDie(&pd, remote_host, argv[1]); 62 | 63 | if (strcmp(argv[3], "yao") == 0) { 64 | io.proto = 1; 65 | } else if (strcmp(argv[3], "dualex") == 0) { 66 | io.proto = 2; 67 | } else { 68 | io.proto = 0; 69 | } 70 | 71 | start = wallClock(); 72 | 73 | if (io.proto == 1) { 74 | execYaoProtocol(&pd, aggregate, &io); 75 | } else { 76 | execDualexProtocol(&pd, aggregate, &io); 77 | } 78 | 79 | end = wallClock(); 80 | 81 | fprintf(stderr, "\nParty %d, Elapsed Time: %f seconds \n", party, end - start); 82 | 83 | if (party == 1) { 84 | fptr4=fopen("Output/beta_avg.txt","w"); 85 | for(i = 0; i < D; i++) 86 | fprintf(fptr4, "%.8f ", io.beta_avg[i]*1.0/SCALE); 87 | fclose(fptr4); 88 | } 89 | 90 | cleanupProtocol(&pd); 91 | 92 | return 0; 93 | } 94 | -------------------------------------------------------------------------------- /model_aggregate_laplace/modelAggregate.oc: -------------------------------------------------------------------------------- 1 | #include "modelAggregate.oh" 2 | 3 | void aggregate(void* args) 4 | { 5 | protocolIO *io = args; 6 | obliv int64_t beta_avg[D], random_vals[D], n_min, sizes[M], b, sign, res, res2; 7 | obig randval, logval, randval2, logval2; 8 | int64_t prec, prec2, val, gates; 9 | 10 | obig_init(&randval, MAXN); 11 | obig_init(&logval, MAXN); 12 | obig_init(&randval2, MAXN); 13 | obig_init(&logval2, MAXN); 14 | 15 | for(int i = 0; i < M; i++) { 16 | sizes[i] = feedOblivLLong(io->sizes[i], 1); 17 | } 18 | n_min = sizes[0]; 19 | for(int i = 1; i < M; i++) { 20 | obliv if (n_min > sizes[i]) { 21 | n_min = sizes[i]; 22 | } 23 | } 24 | 25 | for(int j = 0; j < D; j++) 26 | { 27 | beta_avg[j] = 0; 28 | random_vals[j] = 0; 29 | for(int i = 0; i < M; i++) { 30 | beta_avg[j] += (feedOblivLLong(io->beta1[i][j], 1) ^ feedOblivLLong(io->beta2[i][j], 2)); 31 | random_vals[j] ^= feedOblivLLong(io->random_vals[i][j], 1); 32 | } 33 | beta_avg[j] /= M; 34 | } 35 | 36 | b = 2 * SCALE / (M * n_min * io->lambda * io->epsilon); 37 | 38 | ////////// lap(b) - (+/-) * log(random_vals) * b; b = 2 * SCALE / (m * n * lambda * epsilon); random_vals should be in (0,1] 39 | 40 | obig_import_onative(&randval2, RAND_MAX); 41 | ofixed_ln(&logval2, &prec2, randval2, 0); 42 | res2 = obig_export_onative_signed(logval2); 43 | res2 /= (1LL << prec2); 44 | 45 | for(int j = 0; j < D; j++) { 46 | sign = 1; 47 | obliv if (random_vals[j] < 0) { 48 | sign = -1; 49 | } 50 | 51 | obig_import_onative(&randval, random_vals[j]); 52 | gates = yaoGateCount(); 53 | ofixed_ln(&logval, &prec, randval, 0); 54 | gates = yaoGateCount() - gates; 55 | res = obig_export_onative_signed(logval); 56 | res /= (1LL << prec); 57 | fprintf(stderr, "Log gate count: %llu\n", gates); 58 | beta_avg[j] += (res - res2) * b * sign; 59 | } 60 | 61 | printGateCount(); 62 | 63 | for(int j = 0; j < D; j++) { 64 | revealOblivLLong(&io->beta_avg[j], beta_avg[j], 0); 65 | } 66 | 67 | obig_free(&randval); 68 | obig_free(&logval); 69 | obig_free(&randval2); 70 | obig_free(&logval2); 71 | } 72 | -------------------------------------------------------------------------------- /model_aggregate_laplace/modelAggregate.oh: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_AGGREGATE_OH 2 | #define MODEL_AGGREGATE_OH 3 | 4 | #include 5 | #include 6 | #include 7 | #include "ofixed.oh" 8 | #include "util.h" 9 | 10 | #define MAXN 16 11 | #define D 104 // 122 KDD99, 104 Adult, 95 KDD98 12 | #define M 100 13 | #define SCALE 1000000000 14 | 15 | #define printGateCount() fprintf(stderr, "Yao gate count: %llu\n", yaoGateCount()) 16 | 17 | typedef struct protocolIO{ 18 | int64_t beta1[M][D]; // Model Parameters Share of Party 1 19 | int64_t beta2[M][D]; // Model Parameters Share of Party 2 20 | int64_t beta_avg[D]; // Aggregate Model Parameters 21 | int64_t random_vals[M][D]; // Random values for Laplace Noise Generation 22 | int sizes[M]; // Dataset Sizes 23 | int lambda; // Regularization Parameter 24 | int epsilon; // Privacy Budget 25 | int proto; // CommandLine Argument: 1 -> Yao and 2 -> DualEx 26 | }protocolIO; 27 | 28 | void aggregate(void* args); 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /model_wrapper.py: -------------------------------------------------------------------------------- 1 | import time 2 | import pickle 3 | import numpy as np 4 | from sklearn import metrics 5 | from sklearn.model_selection import KFold 6 | from sklearn.utils import shuffle 7 | from utility import secure_aggregate_laplace, secure_aggregate_gaussian 8 | import matplotlib.pyplot as plt 9 | 10 | #################### 11 | # chunk_size = 300 (adult), 10,000 (kdd) 12 | # train_size = 30,000 (adult), 1,000,000 (kdd) 13 | # test_size = ~15,000 (adult), ~3,000,000 (kdd) 14 | #################### 15 | 16 | epsilon = 0.5 17 | eta = 1. 18 | lambda2 = 0.001 19 | delta = 0.001 20 | M = 100 21 | chunk = 500 22 | T = 1500 23 | SCALE = 1000000000 24 | 25 | 26 | #### gradients #### 27 | 28 | def log_reg_grad(v, X, y, lambda2): 29 | n, d = X.shape[0], X.shape[1] 30 | y = np.matrix(y).reshape((n, 1)) 31 | X = np.array(np.multiply(X, y)) 32 | l = np.exp(np.dot(X, v)) 33 | return -np.dot(X.T, 1. / (1 + l)) / n + lambda2 * v 34 | 35 | def lin_reg_grad(v, X, y, lambda2): 36 | n, d = X.shape[0], X.shape[1] 37 | XtX = np.dot(X.T, X) 38 | Xty = np.dot(X.T, y) 39 | return (np.dot(XtX, v) - Xty) / n + lambda2 * v 40 | 41 | def gradient(v, X, y, lambda2): 42 | return log_reg_grad(v, X, y, lambda2) 43 | 44 | #### loss values #### 45 | 46 | def log_reg_loss(v, X, y, lambda2): 47 | n, d = X.shape[0], X.shape[1] 48 | y = np.matrix(y).reshape((n, 1)) 49 | X = np.array(np.multiply(X, y)) 50 | return np.sum(np.log(1 + np.exp(np.dot(X, v)))) / n + lambda2 * (np.linalg.norm(v) ** 2) 51 | 52 | def lin_reg_loss(v, X, y, lambda2): 53 | n, d = X.shape[0], X.shape[1] 54 | return np.sum((np.dot(X, v) - y)**2) / n + lambda2 * (np.linalg.norm(v) ** 2) 55 | 56 | def optimality_gap(beta, X, y, lambda2, T, m, epsilon): 57 | return np.abs(log_reg_loss(beta, X, y, lambda2) - log_reg_loss(beta_ref, X, y, lambda2)) 58 | 59 | #### models #### 60 | 61 | def centralized_non_private(X, y, lambda2, T, m, epsilon): 62 | n, d = X.shape[0], X.shape[1] 63 | beta = np.zeros(d) 64 | 65 | for t in range(T): 66 | beta -= eta * gradient(beta, X, y, lambda2) 67 | return beta 68 | 69 | 70 | def distributed_non_private(X, y, lambda2, T, m, epsilon): 71 | n, d = X.shape[0], X.shape[1] 72 | local_betas = np.zeros((m, d)) 73 | acc, loss = [], [] 74 | 75 | for t in range(T): 76 | for j in range(m): 77 | local_betas[j] -= eta * gradient(local_betas[j], X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) 78 | beta = np.sum(local_betas, axis=0) / m 79 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 80 | #acc.append(testModel(xtest, ytest, beta)) 81 | plt.plot(loss) 82 | plt.show() 83 | return beta 84 | 85 | 86 | #### Chaudhuri objective perturbation #### 87 | def local_objective_pert(X, y, lambda2, T, m, epsilon): 88 | n, d = X.shape[0], X.shape[1] 89 | local_betas = np.zeros((m, d)) 90 | acc, loss = [], [] 91 | 92 | epsilon2 = epsilon - 2 * np.log(1. / (4 * chunk * lambda2)) 93 | if epsilon2 > 0: 94 | Delta = 0. 95 | else: 96 | Delta = 1. / (4 * chunk * (np.exp(epsilon / 4.) - 1)) - lambda2 97 | epsilon2 = epsilon / 2. 98 | 99 | b = np.random.laplace(0, 2. / epsilon2, d) 100 | 101 | for t in range(T): 102 | for j in range(m): 103 | local_betas[j] -= eta * ( gradient(local_betas[j], X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) + Delta * local_betas[j] + b / chunk ) 104 | beta = np.sum(local_betas, axis=0) / m 105 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 106 | #acc.append(testModel(xtest, ytest, beta)) 107 | plt.plot(loss) 108 | plt.show() 109 | return beta 110 | 111 | 112 | #### Chaudhuri output perturbation #### 113 | def local_output_pert(X, y, lambda2, T, m, epsilon): 114 | n, d = X.shape[0], X.shape[1] 115 | local_betas = np.zeros((m, d)) 116 | acc, loss = [], [] 117 | 118 | for t in range(T): 119 | for j in range(m): 120 | local_betas[j] -= eta * gradient(local_betas[j], X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) 121 | beta = np.sum(local_betas, axis=0) / m + np.random.laplace(0, 2. / (chunk * lambda2 * epsilon), d) / np.sqrt(m) 122 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 123 | #acc.append(testModel(xtest, ytest, beta)) 124 | plt.plot(loss) 125 | plt.show() 126 | return beta 127 | 128 | 129 | #### Pathak output perturbation #### 130 | def distributed_output_pert(X, y, lambda2, T, m, epsilon): 131 | n, d = X.shape[0], X.shape[1] 132 | local_betas = np.zeros((m, d)) 133 | acc, loss = [], [] 134 | 135 | for t in range(T): 136 | for j in range(m): 137 | local_betas[j] -= eta * gradient(local_betas[j], X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) 138 | beta = np.sum(local_betas, axis=0) / m + np.random.laplace(0, 2. / (chunk * lambda2 * epsilon), d) 139 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 140 | #acc.append(testModel(xtest, ytest, beta)) 141 | plt.plot(loss) 142 | plt.show() 143 | return beta 144 | 145 | 146 | def centralized_gradient_pert(X, y, lambda2, T, m, epsilon): 147 | n, d = X.shape[0], X.shape[1] 148 | beta = np.zeros(d) 149 | acc, loss = [], [] 150 | 151 | for t in range(T): 152 | beta -= eta * ( gradient(beta, X, y, lambda2) + np.random.normal(0, np.sqrt(2. * T) / (n * ( np.sqrt(np.log(1. / delta) + epsilon) - np.sqrt(np.log(1. / delta)) ) ), d) ) 153 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 154 | #acc.append(testModel(xtest, ytest, beta)) 155 | plt.plot(loss) 156 | plt.show() 157 | return beta 158 | 159 | 160 | #### Shokri gradient perturbation #### 161 | def local_gradient_pert(X, y, lambda2, T, m, epsilon): 162 | n, d = X.shape[0], X.shape[1] 163 | beta = np.zeros(d) 164 | acc, loss = [], [] 165 | 166 | for t in range(T): 167 | grad = np.zeros(d) 168 | for j in range(m): 169 | grad += gradient(beta, X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) 170 | beta -= eta * ( grad / m + np.random.normal(0, np.sqrt(2. * T) / (chunk * ( np.sqrt(np.log(1. / delta) + epsilon) - np.sqrt(np.log(1. / delta)) ) ), d) / np.sqrt(m) ) 171 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 172 | #acc.append(testModel(xtest, ytest, beta)) 173 | plt.plot(loss) 174 | plt.show() 175 | return beta 176 | 177 | 178 | #### Rajkumar and Arun objective perturbation #### 179 | def centralized_objective_pert(X, y, lambda2, T, m, epsilon): 180 | n, d = X.shape[0], X.shape[1] 181 | local_betas = np.zeros((m, d)) 182 | beta = np.zeros(d) 183 | acc, loss = [], [] 184 | 185 | epsilon2 = epsilon - 2 * np.log(1. / (4 * chunk * lambda2)) 186 | if epsilon2 > 0: 187 | Delta = 0. 188 | else: 189 | Delta = 1. / (4 * chunk * (np.exp(epsilon / 4.) - 1)) - lambda2 190 | epsilon2 = epsilon / 2. 191 | 192 | b = np.random.normal(0, 2. * np.sqrt(2 * np.log(1.25 / delta)) / epsilon2, d) 193 | 194 | for t in range(T): 195 | grad = np.zeros(d) 196 | for j in range(m): 197 | grad += gradient(beta, X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) 198 | beta -= eta * ( grad / m + Delta * beta / (m * chunk) + b / (m * chunk) + np.random.laplace(0, 2. / (m * chunk * epsilon), d) ) 199 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 200 | #acc.append(testModel(xtest, ytest, beta)) 201 | plt.plot(loss) 202 | plt.show() 203 | return beta 204 | 205 | 206 | #### Proposed Method 1: Output Perturbation #### 207 | def proposed_output_pert(X, y, lambda2, T, m, epsilon): 208 | n, d = X.shape[0], X.shape[1] 209 | local_betas = np.zeros((m, d)) 210 | acc, loss = [], [] 211 | 212 | for t in range(T): 213 | for j in range(m): 214 | local_betas[j] -= eta * gradient(local_betas[j], X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) 215 | # Note: set useMPC=True to run the secure MPC code 216 | beta = secure_aggregate_laplace(local_betas, 2. / (m * chunk * lambda2 * epsilon), useMPC=False) 217 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 218 | #acc.append(testModel(xtest, ytest, beta)) 219 | plt.plot(loss) 220 | plt.show() 221 | return beta 222 | 223 | 224 | #### Proposed Method 2: Gradient Perturbation #### 225 | def proposed_gradient_pert(X, y, lambda2, T, m, epsilon): 226 | n, d = X.shape[0], X.shape[1] 227 | beta = np.zeros(d) 228 | acc, loss = [], [] 229 | 230 | for t in range(T): 231 | grads = [gradient(beta, X[j * chunk : (j + 1) * chunk], y[j * chunk : (j + 1) * chunk], lambda2) for j in range(m)] 232 | # Note: set useMPC=True to run the secure MPC code 233 | grad = secure_aggregate_gaussian(np.array(grads), np.sqrt(2. * T) / (m * chunk * (np.sqrt(np.log(1. / delta) + epsilon) - np.sqrt(np.log(1. / delta)))), useMPC=False) 234 | beta -= eta * grad 235 | loss.append(optimality_gap(beta, X, y, lambda2, T, m, epsilon)) 236 | #acc.append(testModel(xtest, ytest, beta)) 237 | plt.plot(loss) 238 | plt.show() 239 | return beta 240 | 241 | 242 | #################### 243 | 244 | def testModel(X, y, beta): 245 | ypred = 2 * (np.dot(X, beta) > 0) - 1 246 | ypred_ref = 2 * (np.dot(X, beta_ref) > 0) - 1 247 | return np.abs(metrics.accuracy_score(y, ypred) - metrics.accuracy_score(y, ypred_ref)) 248 | #return np.abs(metrics.mean_squared_error(y, np.dot(X, beta)) - metrics.mean_squared_error(y, np.dot(X, beta_ref))) 249 | 250 | 251 | #################### 252 | 253 | 254 | def crossValidate(X, y, modelName, m): 255 | switch = { 256 | "centralized_non_private" : centralized_non_private, 257 | "distributed_non_private" : distributed_non_private, 258 | "local_output_pert" : local_output_pert, 259 | "distributed_output_pert" : distributed_output_pert, 260 | "proposed_output_pert" : proposed_output_pert, 261 | "local_objective_pert" : local_objective_pert, 262 | "centralized_gradient_pert" : centralized_gradient_pert, 263 | "local_gradient_pert" : local_gradient_pert, 264 | "proposed_gradient_pert" : proposed_gradient_pert, 265 | "centralized_objective_pert" : centralized_objective_pert 266 | } 267 | fun = switch.get(modelName) 268 | 269 | for i in [-10., -7., -3.5, -2.5, -2., -1.5]: 270 | kf = KFold(n_splits=5) 271 | acc = [] 272 | param = 10 ** i 273 | for train_index, test_index in kf.split(X): 274 | xtrain, ytrain = X[train_index], y[train_index] 275 | xtest, ytest = X[test_index], y[test_index] 276 | n, d = xtrain.shape[0], xtrain.shape[1] 277 | for runs in range(5): 278 | beta = fun(xtrain, ytrain, param, T, m, epsilon) 279 | acc.append(testModel(xtest, ytest, beta)) 280 | print(np.mean(acc)) 281 | 282 | 283 | def trainAggregateModel(xtrain, ytrain, xtest, ytest, modelName, m): 284 | switch = { 285 | "centralized_non_private" : centralized_non_private, 286 | "distributed_non_private" : distributed_non_private, 287 | "local_output_pert" : local_output_pert, 288 | "distributed_output_pert" : distributed_output_pert, 289 | "proposed_output_pert" : proposed_output_pert, 290 | "local_objective_pert" : local_objective_pert, 291 | "centralized_gradient_pert" : centralized_gradient_pert, 292 | "local_gradient_pert" : local_gradient_pert, 293 | "proposed_gradient_pert" : proposed_gradient_pert, 294 | "centralized_objective_pert" : centralized_objective_pert 295 | } 296 | fun = switch.get(modelName) 297 | for epsilon in [0.5]:#0.01, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5]: 298 | acc, gap = [], [] 299 | n, d = xtrain.shape[0], xtrain.shape[1] 300 | for runs in range(1): 301 | beta = fun(xtrain, ytrain, lambda2, T, m, epsilon) 302 | acc.append(testModel(xtest, ytest, beta)) 303 | gap.append(optimality_gap(beta, xtrain, ytrain, lambda2, T, m, epsilon)) 304 | print("Relative Error is : " + str(np.mean(acc))) 305 | print("Optimality Gap is : " + str(np.mean(gap))) 306 | 307 | 308 | #################### 309 | 310 | #X, y = pickle.load(open('Dataset/adult_data.p', 'rb')) 311 | #X, y = pickle.load(open('Dataset/kddcup98_data_70k.p', 'rb')) 312 | X, y = pickle.load(open('Dataset/kddcup99_data_70k.p', 'rb')) 313 | 314 | X, y = shuffle(X, y, random_state = 0) 315 | print(X.shape, y.shape) 316 | 317 | modelName = 'centralized_objective_pert' 318 | print(modelName) 319 | print('##############') 320 | beta_ref = centralized_non_private(X[:50000], y[:50000], lambda2, 1500, M, epsilon) 321 | 322 | xtest, ytest = X[50000:], y[50000:] 323 | 324 | #crossValidate(X[:50000], y[:50000], modelName, 80) 325 | 326 | t0 = time.time() 327 | trainAggregateModel(X[:50000], y[:50000], X[50000:], y[50000:], modelName, M) 328 | t1 = time.time() 329 | print('Runtime : ' + str(t1-t0)) 330 | -------------------------------------------------------------------------------- /ofixed.oc: -------------------------------------------------------------------------------- 1 | #include 2 | #include "ofixed.oh" 3 | #include "ofixed_constants.h" 4 | #include 5 | 6 | #include 7 | 8 | #define MAX(a,b) \ 9 | ({ __typeof__ (a) _a = (a); \ 10 | __typeof__ (b) _b = (b); \ 11 | _a > _b ? _a : _b; }) 12 | 13 | #define MIN(a,b) \ 14 | ({ __typeof__ (a) _a = (a); \ 15 | __typeof__ (b) _b = (b); \ 16 | _a < _b ? _a : _b; }) 17 | 18 | size_t ceildiv(size_t dividend, size_t divisor) { 19 | return (dividend + divisor - 1) / divisor; 20 | } 21 | 22 | #if !(BIT_WIDTH_32) 23 | void obig_max(obig *a) obliv { 24 | for(size_t i = 0; i < a->digits; i++) { 25 | if(i < a->digits - 1) { 26 | a->data[i] = (uint8_t) 0xFF; 27 | } else { 28 | a->data[i] = (uint8_t) 0x7F; // msb zero 29 | } 30 | } 31 | } 32 | #endif 33 | 34 | // checks if 'in' is greater than ofixed_max or less than -ofixed_max 35 | // and sets 'out' to the respecitve limit if that's the case, and to 'in' 36 | // otherwise 37 | void ofixed_check_overflow(ofixed_t *out, ofixed_t in) obliv { 38 | #if BIT_WIDTH_32 39 | obliv if(in > (obliv int64_t) INT32_MAX) { 40 | *out = INT32_MAX; 41 | } else obliv if(in < (obliv int64_t) INT32_MIN) { 42 | *out = INT32_MIN; 43 | } else { 44 | *out = in; 45 | } 46 | #else 47 | // obig_copy(out, in); 48 | // return; // assume overflows don't happen 49 | if(in.digits <= out->digits) { 50 | obig_copy_signed(out, in); // definitely fits, just copy 51 | return; 52 | } 53 | obig temp, max; 54 | obig *tempptr = &temp; 55 | ~obliv() obig_init(&temp, in.digits); 56 | ~obliv() obig_init(&max, out->digits); 57 | obig_max(&max); 58 | obliv bool overflowed = false; 59 | obliv if(!obig_ltz_signed(in)) { 60 | // check overflows by checking if higher bytes are all zero 61 | for(size_t i = out->digits; i < in.digits; i++) { 62 | obliv if(in.data[i] != 0) { 63 | overflowed = true; 64 | } 65 | } 66 | obliv if(overflowed) { 67 | obig_copy_signed(out, max); 68 | } 69 | } else { 70 | // check overflows by checking if higher bytes are all 0xFF 71 | for(size_t i = out->digits; i < in.digits; i++) { 72 | obliv if(in.data[i] != (uint8_t) 0xFF) { 73 | overflowed = true; 74 | } 75 | } 76 | obliv if(overflowed) { 77 | obig_neg_signed(out, max); // min = -max 78 | } 79 | } 80 | obliv if(!overflowed) { 81 | obig_copy_signed(out, in); 82 | } 83 | ~obliv() obig_free(&temp); 84 | ~obliv() obig_free(&max); 85 | #endif 86 | } 87 | 88 | 89 | 90 | 91 | obliv int8_t ofixed_cmp(ofixed_t a, ofixed_t b) obliv { 92 | #if BIT_WIDTH_32 93 | obliv int8_t result = 0; 94 | obliv if(a < b) result = -1; 95 | obliv if(a > b) result = 1; 96 | return result; 97 | #else 98 | return obig_cmp(a, b); 99 | #endif 100 | 101 | } 102 | 103 | void ofixed_abs(ofixed_t *out, ofixed_t a) obliv { 104 | #if BIT_WIDTH_32 105 | obliv if(a < 0) *out = 0-a; // unary minus not defined for "obliv" types? 106 | else *out = a; 107 | #else 108 | obig_abs(out, a); 109 | #endif 110 | } 111 | 112 | void ofixed_add(ofixed_t *out, ofixed_t a, ofixed_t b) obliv { 113 | #if BIT_WIDTH_32 114 | *out = a + b; 115 | #else 116 | obig temp; 117 | ~obliv() obig_init(&temp, (a.digits > b.digits ? a : b).digits + 1); 118 | obig_add_signed(&temp, a, b); 119 | obig_copy(out, temp); 120 | ~obliv() obig_free(&temp); 121 | #endif 122 | } 123 | 124 | void ofixed_sub(ofixed_t *out, ofixed_t a, ofixed_t b) obliv { 125 | #if BIT_WIDTH_32 126 | *out = a - b; 127 | #else 128 | obig temp; 129 | ~obliv() obig_init(&temp, (a.digits > b.digits ? a : b).digits + 1); 130 | obig_sub_signed(&temp, a, b); 131 | obig_copy(out, temp); 132 | ~obliv() obig_free(&temp); 133 | #endif 134 | } 135 | 136 | 137 | void ofixed_inner_product(ofixed_t *out, ofixed_t *a, ofixed_t *b, size_t p, size_t d) obliv { 138 | #if BIT_WIDTH_32 139 | obliv int64_t temp; 140 | for(size_t i = 0; i < d; i++) { 141 | temp += (obliv int64_t) a[i] * (obliv int64_t) b[i]; 142 | } 143 | *out = temp >> p; 144 | #else 145 | obig temp1, temp2, temp3; 146 | ~obliv() obig_init(&temp1, a[0].digits + b[0].digits + d); 147 | ~obliv() obig_init(&temp2, a[0].digits + b[0].digits); 148 | ~obliv() obig_init(&temp3, a[0].digits + b[0].digits); 149 | obig_zero(&temp1); 150 | for(size_t i = 0; i < d; i++) { 151 | obig_mul_signed(&temp2, a[i], b[i]); 152 | ofixed_add(&temp1, temp1, temp2); 153 | } 154 | obig_shr_native_signed(&temp3, temp1, p); 155 | obig_copy(out, temp3); 156 | ~obliv() obig_free(&temp1); 157 | ~obliv() obig_free(&temp2); 158 | ~obliv() obig_free(&temp3); 159 | #endif 160 | } 161 | 162 | void ofixed_mul(ofixed_t *out, ofixed_t a, ofixed_t b, size_t p) obliv { 163 | #if BIT_WIDTH_32 164 | *out = ((obliv int64_t) a * (obliv int64_t) b) >> p; 165 | #else 166 | obig temp, temp2; 167 | ~obliv() obig_init(&temp, a.digits + b.digits); 168 | ~obliv() obig_init(&temp2, a.digits + b.digits); 169 | obig_mul_signed(&temp, a, b); 170 | obig_shr_native_signed(&temp2, temp, p); 171 | obig_copy(out, temp2); 172 | ~obliv() obig_free(&temp); 173 | ~obliv() obig_free(&temp2); 174 | #endif 175 | } 176 | 177 | obliv bool ofixed_div(ofixed_t *out, ofixed_t a, ofixed_t b, size_t p) obliv { 178 | #if BIT_WIDTH_32 179 | *out = ((obliv int64_t) a << p) / (obliv int64_t) b; 180 | return true; 181 | #else 182 | obig temp, temp2, *tempptr = &temp, *temp2ptr = &temp2; 183 | obliv bool result; 184 | ~obliv() obig_init(&temp, a.digits + ceildiv(p,8)); 185 | ~obliv() obig_init(&temp2, a.digits + ceildiv(p,8)); 186 | /* obliv if(obig_eqz(b)) { // handle division by zero 187 | obliv bool a_neg = obig_ltz_signed(a); 188 | ofixed_max(out); 189 | obliv if(a_neg) { 190 | obig_neg(out, *out); 191 | } 192 | } else {*/ 193 | obig_shl_native_signed(tempptr, a, p); 194 | result = obig_div_mod_signed(temp2ptr, NULL, temp, b); 195 | obig_copy(out, temp2); 196 | /* }*/ 197 | ~obliv() obig_free(&temp); 198 | ~obliv() obig_free(&temp2); 199 | return result; 200 | #endif 201 | } 202 | 203 | obliv bool ofixed_div_overflow(ofixed_t *out, ofixed_t a, ofixed_t b, size_t p) obliv { 204 | #if BIT_WIDTH_32 205 | obliv int64_t temp = ((obliv int64_t) a << p) / (obliv int64_t) b; 206 | ofixed_check_overflow(out, temp); 207 | return true; 208 | #else 209 | obig temp, temp2, *tempptr = &temp, *temp2ptr = &temp2; 210 | obliv bool result; 211 | ~obliv() obig_init(&temp, a.digits + ceildiv(p,8)); 212 | ~obliv() obig_init(&temp2, a.digits + ceildiv(p,8)); 213 | /* obliv if(obig_eqz(b)) { // handle division by zero 214 | obliv bool a_neg = obig_ltz_signed(a); 215 | ofixed_max(out); 216 | obliv if(a_neg) { 217 | obig_neg(out, *out); 218 | } 219 | } else {*/ 220 | obig_shl_native_signed(tempptr, a, p); 221 | result = obig_div_mod_signed(temp2ptr, NULL, temp, b); 222 | ofixed_check_overflow(out, temp2); 223 | /* }*/ 224 | ~obliv() obig_free(&temp); 225 | ~obliv() obig_free(&temp2); 226 | return result; 227 | #endif 228 | } 229 | 230 | #if BIT_WIDTH_32 231 | // returns a mask of the lowest (FIXED_BIT_SIZE + p) bits. 232 | // saves garbled gates for some operations 233 | static int64_t fixed_mask(int p) { 234 | return ((1ll << (FIXED_BIT_SIZE + p)) - 1); 235 | } 236 | #endif 237 | 238 | void ofixed_sqrt(ofixed_t *out, ofixed_t a, size_t p) obliv { 239 | #if BIT_WIDTH_32 240 | // limit number of bits 241 | int64_t mask; 242 | ~obliv() mask = fixed_mask(p); 243 | obliv int64_t x = ((obliv int64_t) a << p) & mask; 244 | obliv int64_t r = 0; 245 | for(int64_t e = mask + 1; e != 0; e >>= 2) { 246 | obliv if((x & mask) >= ((r + e) & mask)) { 247 | x -= r + e; 248 | r = ((r >> 1) + e) & mask; 249 | } else { 250 | r = r >> 1; 251 | } 252 | } 253 | *out = r; 254 | #else 255 | obig temp; 256 | ~obliv() obig_init(&temp, a.digits + ceildiv(p,8)); 257 | obig_shl_native_signed(&temp, a, p); 258 | obig_sqrt(out, temp); 259 | ~obliv() obig_free(&temp); 260 | #endif 261 | } 262 | 263 | void ofixed_ln12(obig * r, obig x) obliv { 264 | /* This function computes the natural logarithm of inputs in the range [1,2), using the Feynman Logarithm 265 | function, as specified below. 266 | */ 267 | obig a, b, temp; 268 | obig * aref = &a; // workaround for oblivc bug 269 | obig * tempref = &temp; 270 | ~obliv() obig_init(&a, x.digits + 1); 271 | ~obliv() obig_init(&b, x.digits + 1); // An extra digit is necessary to prevent b = a * (1+2^-k) from overflowing 272 | ~obliv() obig_init(&temp, r->digits); 273 | obig_zero(r); 274 | a.data[a.digits-2]=0x80; 275 | 276 | for (size_t ii = 1; ii < x.digits * 8; ii++) { 277 | obig_copy(&b, a); 278 | obig_shr_native(&b, b, ii); 279 | obig_add(&b, b, a); 280 | 281 | obliv if(obig_lte(b, x)) { 282 | obig_copy(aref, b); 283 | obig_import_pointed(tempref, ofixed_ln_log_components + ((ii+1) * OFIXED_LN_OUTPUT_PRECISION/8) - temp.digits, temp.digits); 284 | obig_add(r, *r, temp); 285 | } 286 | } 287 | ~obliv() obig_free(&a); 288 | ~obliv() obig_free(&b); 289 | ~obliv() obig_free(&temp); 290 | } 291 | 292 | 293 | bool ofixed_ln(ofixed_t *out, size_t * outp, ofixed_t a, size_t p) obliv { 294 | /* This function implements the Feynman Logarithm algorithm, as described in 295 | http://longnow.org/essays/richard-feynman-connection-machine/ 296 | 297 | In short, it uses a lookup table (found in ofixed_constants.oh and generated 298 | by gen_constants.py) to compute ln(x) in O(n^2). As a consequence of this approach, 299 | it can only handle inputs with lengths less than the values in the lookup table 300 | (by default 256 bits). 301 | 302 | ofixed_ln() is primarily responsible for normalizing its input values into the 303 | range [1,2); it calls ofixed_ln12() to find logarithms within this range. 304 | 305 | We take parameters: 306 | a - the input value 307 | p (input precision) - the number of bits devoted to the fractional part of the input value 308 | *out () - pointer to an obig into which the output value can be written 309 | *outp (output precision) - the number of bits devoted to the fractional part of the output 310 | value. This is set automatically to achieve the best possible precision 311 | 312 | In addition, the function outputs a bool indicating whether the input value was out of range. 313 | */ 314 | 315 | #if BIT_WIDTH_32 316 | //nothing 317 | #else 318 | if (a.digits * 8 > OFIXED_LN_INPUT_PRECISION) return false; 319 | 320 | obliv uint32_t normalize, denormalize; 321 | obig denormalizer; 322 | obig * denormalizerref = &denormalizer; //oblivc bug workaround 323 | obig tempin; 324 | ~obliv() obig_init(&tempin, a.digits); 325 | ~obliv() obig_init(&denormalizer, out->digits + 1); 326 | 327 | size_t intp_in = a.digits*8 - p; 328 | size_t fracp_in = p; 329 | size_t intp_out; 330 | ~obliv() intp_out = ceil(MAX(log2(a.digits*8 - p),log2(p))) + 1; 331 | size_t fracp_out = out->digits*8 - intp_out; 332 | *outp = fracp_out; 333 | 334 | for (int64_t ii = 0; ii < a.digits*8; ii++) { 335 | obliv if (obig_bit_get(a,ii) == 1) { 336 | normalize = ii; 337 | } 338 | } 339 | 340 | for (size_t ii = 0; ii < p; ii++) { 341 | obliv if (obig_bit_get(a, ii) == 1) { 342 | size_t row_end = ofixed_ln_normalize_factors + (p-ii)*(OFIXED_LN_OUTPUT_PRECISION+OFIXED_LN_NORMALIZE_INT_BITS)/8; 343 | obig_import_pointed(denormalizerref, row_end - (fracp_out/8 + OFIXED_LN_NORMALIZE_INT_BITS/8 + 1), (fracp_out/8 + OFIXED_LN_NORMALIZE_INT_BITS/8 + 1)); 344 | } 345 | } 346 | 347 | for (size_t ii = 0; ii < a.digits*8 - p -1; ii++) { 348 | obliv if (obig_bit_get(a,ii + p + 1) == 1) { 349 | size_t row_end = ofixed_ln_normalize_factors + (ii+1)*(OFIXED_LN_OUTPUT_PRECISION+OFIXED_LN_NORMALIZE_INT_BITS)/8; 350 | obig_import_pointed(denormalizerref, row_end - (fracp_out/8 + OFIXED_LN_NORMALIZE_INT_BITS/8 + 1), (fracp_out/8 + OFIXED_LN_NORMALIZE_INT_BITS/8 + 1)); 351 | } 352 | } 353 | 354 | obig_shr_native(&denormalizer, denormalizer, 7-fracp_out%8); 355 | 356 | denormalize = intp_out; 357 | 358 | obig_shl_onative(&tempin, a, a.digits * 8 - normalize - 1); 359 | 360 | ofixed_ln12(out, tempin); 361 | 362 | obig_shr_onative(out, *out, denormalize); 363 | 364 | obliv if (normalize > p) obig_add(out, *out, denormalizer); 365 | obliv if (normalize < p) obig_sub(out, *out, denormalizer); 366 | 367 | ~obliv() obig_free(&denormalizer); 368 | ~obliv() obig_free(&tempin); 369 | 370 | return true; 371 | #endif 372 | } 373 | 374 | 375 | void ofixed_exp12(obig * r, obig x) obliv { 376 | /* This computes e^x for values within the range [0,ln(2)), using the Inverse Feynman Logarithm, 377 | as specified below. 378 | */ 379 | 380 | obig a, b, c; 381 | obig * aref = &a; // workaround for oblivc bug 382 | obig * cref = &c; 383 | ~obliv() obig_init(&a, x.digits); 384 | ~obliv() obig_init(&b, x.digits); 385 | ~obliv() obig_init(&c, r->digits); 386 | obig_zero(r); 387 | r->data[r->digits-1]=0x01; // one extra digit is necessary, as in ofixed_ln12() 388 | 389 | for (size_t ii = 0; ii < x.digits * 8; ii++) { 390 | obig_import_pointed(&b, ofixed_ln_log_components + ((ii+1) * OFIXED_LN_OUTPUT_PRECISION/8) - b.digits, b.digits); 391 | obig_add(&b, b, a); 392 | 393 | obliv if(obig_lte(b, x)) { 394 | obig_shr_native(cref, *r, ii); 395 | obig_add(r, *r, c); 396 | obig_copy(aref, b); 397 | } 398 | } 399 | ~obliv() obig_free(&a); 400 | ~obliv() obig_free(&b); 401 | ~obliv() obig_free(&c); 402 | } 403 | 404 | obliv bool ofixed_exp_ranged(ofixed_t *out, size_t fracp_out, ofixed_t a, size_t p) obliv { 405 | /* This algorithm implements what I will call the Inverse Feynman Logarithm. In short, it does 406 | exactly the opposite of the natural log function, above. Thus, it uses a lookup table to compute 407 | e^x in O(n^2). 408 | 409 | Note: a consequence of this method is that the algorithm fails for any value outside the range 410 | represented in the lookup table. By default this is -256 to +256 (which seems sensible). 411 | 412 | ofixed_exp is responsible primarily for normalization into the range [0,ln(2)); it calls 413 | ofixed_exp12() to find e^x for values within that range. 414 | 415 | We take parameters: 416 | a (exponent) - the input exponent 417 | p (input precision) - the number of bits devoted to the fractional part of the input value 418 | *out () - pointer to an obig into which the output value can be written 419 | *outp (output precision) - the number of bits devoted to the fractional part of the output 420 | value. This is set automatically to avoid overflow if at all possible. If more fractional 421 | bits are required, use a longer output obig 422 | 423 | In addition, the function outputs an obliv bool indicating whether overflow has happened (as 424 | noted above). This flag does not signal underflow, however. 425 | */ 426 | 427 | #if BIT_WIDTH_32 428 | //nothing 429 | #else 430 | size_t fracp_in = p; 431 | size_t intp_in = a.digits * 8 - p; 432 | size_t fracp_working = fracp_in + (8-(fracp_in%8)); 433 | size_t intp_working = MAX(intp_in,OFIXED_LN_NORMALIZE_INT_BITS) + (8-(MAX(intp_in,OFIXED_LN_NORMALIZE_INT_BITS)%8))%8; 434 | size_t intp_normalizer = OFIXED_LN_NORMALIZE_INT_BITS + (8-(OFIXED_LN_NORMALIZE_INT_BITS%8))%8; 435 | 436 | size_t fracp_r = out->digits*8; 437 | 438 | 439 | obig normalizer, temp, temp2, ln2, a2, a3, r; 440 | obig * normalizerref = &normalizer; 441 | obig * a2ref = &a2; 442 | obig * temp2ref = &temp2; 443 | 444 | ~obliv() obig_init(&normalizer, (intp_normalizer + fracp_working)/8); 445 | ~obliv() obig_init(&temp, (intp_normalizer + fracp_working)/8); 446 | ~obliv() obig_init(&temp2, (intp_normalizer + fracp_working)/8); 447 | ~obliv() obig_init(&ln2, (intp_normalizer + fracp_working)/8); 448 | ~obliv() obig_init(&a2, (intp_working + fracp_working)/8); 449 | ~obliv() obig_init(&r, (fracp_r)/8 + 1); 450 | 451 | obliv bool invert = false; 452 | obliv bool found = false; 453 | obliv uint32_t normalize; 454 | obliv int32_t denormalize; 455 | 456 | obig_shl_native_signed(&a2, a, fracp_working - fracp_in -1); 457 | 458 | obliv if (obig_ltz_signed(a2)) { 459 | obig_neg_signed(a2ref, a2); 460 | invert = true; 461 | } 462 | 463 | obig_import_pointed(&ln2, ofixed_ln_normalize_factors+(OFIXED_LN_OUTPUT_PRECISION+OFIXED_LN_NORMALIZE_INT_BITS)/8 - (intp_normalizer + fracp_working)/8, (intp_normalizer + fracp_working)/8); 464 | obig_shr_native(&ln2, ln2, intp_normalizer - OFIXED_LN_NORMALIZE_INT_BITS); 465 | 466 | for (size_t ii = 0; ii < a.digits*8; ii++) { 467 | size_t row_end = ofixed_ln_normalize_factors + (ii+1)*(OFIXED_LN_OUTPUT_PRECISION+OFIXED_LN_NORMALIZE_INT_BITS)/8; 468 | obig_import_pointed(&temp, row_end - (intp_normalizer + fracp_working)/8, (intp_normalizer + fracp_working)/8); 469 | obig_shr_native(&temp, temp, intp_normalizer - OFIXED_LN_NORMALIZE_INT_BITS); 470 | 471 | obig_sub_signed(&temp2, a2, temp); 472 | obliv if (invert) obig_neg_signed(temp2ref, temp2); 473 | 474 | obliv if (obig_lte(temp2, ln2) & ~invert & ~found) { 475 | found = true; 476 | denormalize = -(ii+1); 477 | obig_copy(normalizerref, temp); 478 | } else obliv if (obig_lte_signed(temp2, ln2) & invert) { 479 | found = true; 480 | denormalize = ii+1; 481 | obig_copy(normalizerref, temp); 482 | } 483 | } 484 | 485 | obig_shl_native_signed(&normalizer, normalizer, 1); 486 | obig_shl_native_signed(&a2, a, fracp_working - fracp_in); 487 | 488 | obliv if (invert) { 489 | obig_add_signed(a2ref, a2, normalizer); 490 | } else { 491 | obig_sub_signed(a2ref, a2, normalizer); 492 | } 493 | 494 | // We know that 0 < a2 < 1, so we can omit the integer part. 495 | // This hack avoids allocating, copying, or shifting 496 | a2.digits -= intp_working/8; 497 | ofixed_exp12(&r,a2); 498 | 499 | obliv int32_t shiftamt = fracp_r - fracp_out + denormalize; 500 | obliv if (shiftamt >= 0) { 501 | obig_shr_onative(out, r, shiftamt); 502 | } else { 503 | obig_shl_onative(out, r, -shiftamt); 504 | } 505 | 506 | ~obliv() obig_free(&a2); 507 | ~obliv() obig_free(&r); 508 | ~obliv() obig_free(&normalizer); 509 | ~obliv() obig_free(&temp); 510 | ~obliv() obig_free(&temp2); 511 | ~obliv() obig_free(&ln2); 512 | 513 | return found; 514 | #endif 515 | } 516 | 517 | obliv bool ofixed_exp(ofixed_t *out, size_t * outp, ofixed_t a, size_t p) obliv { 518 | size_t intp_in = a.digits * 8 - p; 519 | size_t intp_out; 520 | ~obliv() intp_out = MIN(1ll << intp_in + 1, out->digits*8); 521 | *outp = out->digits*8 - intp_out; 522 | 523 | return ofixed_exp_ranged(out, out->digits*8 - intp_out, a, p); 524 | } 525 | 526 | obliv bool ofixed_sigmoid(obig * r, size_t * rp, obig x, size_t xp) obliv { 527 | obliv bool success; 528 | 529 | obig numerator; 530 | obig denominator; 531 | obig temp; 532 | obig * tempref = &temp; 533 | obig * numref = &numerator; 534 | obig * denref = &denominator; 535 | ~obliv() obig_init(&numerator, x.digits); 536 | ~obliv() obig_init(&denominator, x.digits); 537 | ~obliv() obig_init(&temp, x.digits); 538 | 539 | size_t denominatorp = x.digits * 8 - 3; 540 | 541 | obliv if (obig_ltz_signed(x)) { 542 | obig_copy_signed(tempref, x); 543 | } else { 544 | obig_neg_signed(tempref, x); 545 | } 546 | 547 | success = ofixed_exp_ranged(&denominator, denominatorp, temp, xp); 548 | 549 | obig_one(&temp); 550 | obig_shl_native(&temp, temp, denominatorp); 551 | 552 | obliv if (obig_ltz_signed(x)) { 553 | obig_copy(numref, denominator); 554 | } else { 555 | obig_copy(numref, temp); 556 | } 557 | 558 | obig_add_signed(denref, denominator, temp); 559 | 560 | success &= ofixed_div(&temp, numerator, denominator, denominatorp); 561 | 562 | size_t resultp = r->digits * 8 -3; 563 | if (denominatorp > resultp) { 564 | obig_shr_native_signed(r, temp, denominatorp - resultp); 565 | *rp = resultp; 566 | } else { 567 | obig_copy_signed(r, temp); 568 | *rp = denominatorp; 569 | } 570 | 571 | ~obliv() obig_free(&numerator); 572 | ~obliv() obig_free(&denominator); 573 | ~obliv() obig_free(&temp); 574 | 575 | return success; 576 | } 577 | 578 | 579 | 580 | 581 | 582 | 583 | void ofixed_init(ofixed_t *a) { 584 | #if BIT_WIDTH_32 585 | return; 586 | #else 587 | obig_init(a, FIXED_BIT_SIZE / 8); 588 | #endif 589 | } 590 | 591 | void ofixed_free(ofixed_t *a) { 592 | #if BIT_WIDTH_32 593 | return; 594 | #else 595 | obig_free(a); 596 | #endif 597 | } 598 | 599 | void ofixed_import(ofixed_t *a, obliv fixed_t b) { 600 | #if BIT_WIDTH_32 601 | *a = b; 602 | #else 603 | obig_import_onative_signed(a, b); 604 | #endif 605 | } 606 | 607 | obliv fixed_t ofixed_export(ofixed_t a) { 608 | #if BIT_WIDTH_32 609 | return a; 610 | #else 611 | return obig_export_onative_signed(a); 612 | #endif 613 | } 614 | 615 | void ofixed_copy(ofixed_t *a, ofixed_t b) obliv { 616 | #if BIT_WIDTH_32 617 | *a = b; 618 | #else 619 | obig_copy_signed(a, b); 620 | #endif 621 | } 622 | -------------------------------------------------------------------------------- /ofixed.oh: -------------------------------------------------------------------------------- 1 | #ifndef OFIXED_OH 2 | #define OFIXED_OH 3 | 4 | #include "fixed.h" 5 | #include "obig.oh" 6 | 7 | #if BIT_WIDTH_32 8 | typedef obliv fixed_t ofixed_t; 9 | #else 10 | typedef obig ofixed_t; 11 | #endif 12 | 13 | // comparison only works for unsigned numbers for now 14 | obliv int8_t ofixed_cmp(ofixed_t a, ofixed_t b) obliv; 15 | 16 | void ofixed_abs(ofixed_t *out, ofixed_t in) obliv; 17 | void ofixed_add(ofixed_t *out, ofixed_t a, ofixed_t b) obliv; 18 | void ofixed_sub(ofixed_t *out, ofixed_t a, ofixed_t b) obliv; 19 | void ofixed_mul(ofixed_t *out, ofixed_t a, ofixed_t b, size_t p) obliv; 20 | void ofixed_inner_product(ofixed_t *out, ofixed_t *a, ofixed_t *b, size_t p, size_t d) obliv; 21 | obliv bool ofixed_div(ofixed_t *out, ofixed_t a, ofixed_t b, size_t p) obliv; 22 | obliv bool ofixed_div_overflow(ofixed_t *out, ofixed_t a, ofixed_t b, size_t p) obliv; 23 | void ofixed_sqrt(ofixed_t *out, ofixed_t a, size_t p) obliv; 24 | 25 | bool ofixed_ln(ofixed_t *out, size_t * outp, ofixed_t a, size_t p) obliv; 26 | obliv bool ofixed_exp(ofixed_t *out, size_t * outp, ofixed_t a, size_t p) obliv; 27 | obliv bool ofixed_sigmoid(obig * r, size_t * rp, obig x, size_t xp) obliv; 28 | 29 | // these functions do nothing in 32 bit mode, but are needed for obig 30 | void ofixed_init(ofixed_t *out); 31 | void ofixed_free(ofixed_t *out); 32 | void ofixed_import(ofixed_t *out, obliv fixed_t a); 33 | fixed_t ofixed_export(ofixed_t a); 34 | void ofixed_copy(ofixed_t *out, ofixed_t a) obliv; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /ofixed_constants.h: -------------------------------------------------------------------------------- 1 | #ifndef OFIXED_CONSTANTS_H 2 | #define OFIXED_CONSTANTS_H 3 | 4 | #define OFIXED_LN_NORMALIZE_INT_BITS 8ll 5 | #define OFIXED_LN_INPUT_PRECISION 256ll 6 | #define OFIXED_LN_OUTPUT_PRECISION 256ll 7 | 8 | char ofixed_ln_normalize_factors[] = { 9 | 0x15,0x7D,0xD5,0xC5,0xAD,0x8B,0x06,0xC5,0x16,0x5B,0x4C,0x39,0x93,0xA1,0x79,0xA0,0x57,0x7B,0xF9,0x01,0xCC,0xD9,0xF1,0xE4,0xD5,0xBC,0xE7,0xE8,0xFB,0x0B,0xB9,0x58,0x00, 10 | 0x2B,0xFA,0xAA,0x8B,0x5B,0x17,0x0D,0x8A,0x2D,0xB6,0x98,0x72,0x26,0x43,0xF3,0x40,0xAF,0xF6,0xF2,0x03,0x98,0xB3,0xE3,0xC9,0xAB,0x79,0xCF,0xD1,0xF7,0x17,0x72,0xB1,0x00, 11 | 0x41,0x77,0x80,0x51,0x09,0xA3,0x13,0x4F,0x44,0x11,0xE5,0xAB,0xB9,0xE4,0x6C,0xE1,0x06,0x72,0xEC,0x05,0x64,0x8D,0xD5,0xAE,0x81,0x36,0xB7,0xBA,0xF3,0x23,0x2B,0x0A,0x01, 12 | 0x57,0xF4,0x55,0x17,0xB7,0x2E,0x1A,0x14,0x5B,0x6C,0x31,0xE5,0x4C,0x86,0xE6,0x81,0x5E,0xED,0xE5,0x07,0x30,0x67,0xC7,0x93,0x57,0xF3,0x9E,0xA3,0xEF,0x2F,0xE4,0x62,0x01, 13 | 0x6D,0x71,0x2B,0xDD,0x64,0xBA,0x20,0xD9,0x71,0xC7,0x7D,0x1E,0xE0,0x27,0x60,0x22,0xB6,0x68,0xDF,0x09,0xFC,0x40,0xB9,0x78,0x2D,0xB0,0x86,0x8C,0xEB,0x3B,0x9D,0xBB,0x01, 14 | 0x83,0xEE,0x00,0xA3,0x12,0x46,0x27,0x9E,0x88,0x22,0xCA,0x57,0x73,0xC9,0xD9,0xC2,0x0D,0xE4,0xD8,0x0B,0xC8,0x1A,0xAB,0x5D,0x03,0x6D,0x6E,0x75,0xE7,0x47,0x56,0x14,0x02, 15 | 0x99,0x6B,0xD6,0x68,0xC0,0xD1,0x2D,0x63,0x9F,0x7D,0x16,0x91,0x06,0x6B,0x53,0x63,0x65,0x5F,0xD2,0x0D,0x94,0xF4,0x9C,0x42,0xD9,0x29,0x56,0x5E,0xE3,0x53,0x0F,0x6D,0x02, 16 | 0xAF,0xE8,0xAB,0x2E,0x6E,0x5D,0x34,0x28,0xB6,0xD8,0x62,0xCA,0x99,0x0C,0xCD,0x03,0xBD,0xDA,0xCB,0x0F,0x60,0xCE,0x8E,0x27,0xAF,0xE6,0x3D,0x47,0xDF,0x5F,0xC8,0xC5,0x02, 17 | 0xC5,0x65,0x81,0xF4,0x1B,0xE9,0x3A,0xED,0xCC,0x33,0xAF,0x03,0x2D,0xAE,0x46,0xA4,0x14,0x56,0xC5,0x11,0x2C,0xA8,0x80,0x0C,0x85,0xA3,0x25,0x30,0xDB,0x6B,0x81,0x1E,0x03, 18 | 0xDB,0xE2,0x56,0xBA,0xC9,0x74,0x41,0xB2,0xE3,0x8E,0xFB,0x3C,0xC0,0x4F,0xC0,0x44,0x6C,0xD1,0xBE,0x13,0xF8,0x81,0x72,0xF1,0x5A,0x60,0x0D,0x19,0xD7,0x77,0x3A,0x77,0x03, 19 | 0xF1,0x5F,0x2C,0x80,0x77,0x00,0x48,0x77,0xFA,0xE9,0x47,0x76,0x53,0xF1,0x39,0xE5,0xC3,0x4C,0xB8,0x15,0xC4,0x5B,0x64,0xD6,0x30,0x1D,0xF5,0x01,0xD3,0x83,0xF3,0xCF,0x03, 20 | 0x07,0xDD,0x01,0x46,0x25,0x8C,0x4E,0x3C,0x11,0x45,0x94,0xAF,0xE6,0x92,0xB3,0x85,0x1B,0xC8,0xB1,0x17,0x90,0x35,0x56,0xBB,0x06,0xDA,0xDC,0xEA,0xCE,0x8F,0xAC,0x28,0x04, 21 | 0x1D,0x5A,0xD7,0x0B,0xD3,0x17,0x55,0x01,0x28,0xA0,0xE0,0xE8,0x79,0x34,0x2D,0x26,0x73,0x43,0xAB,0x19,0x5C,0x0F,0x48,0xA0,0xDC,0x96,0xC4,0xD3,0xCA,0x9B,0x65,0x81,0x04, 22 | 0x33,0xD7,0xAC,0xD1,0x80,0xA3,0x5B,0xC6,0x3E,0xFB,0x2C,0x22,0x0D,0xD6,0xA6,0xC6,0xCA,0xBE,0xA4,0x1B,0x28,0xE9,0x39,0x85,0xB2,0x53,0xAC,0xBC,0xC6,0xA7,0x1E,0xDA,0x04, 23 | 0x49,0x54,0x82,0x97,0x2E,0x2F,0x62,0x8B,0x55,0x56,0x79,0x5B,0xA0,0x77,0x20,0x67,0x22,0x3A,0x9E,0x1D,0xF4,0xC2,0x2B,0x6A,0x88,0x10,0x94,0xA5,0xC2,0xB3,0xD7,0x32,0x05, 24 | 0x5F,0xD1,0x57,0x5D,0xDC,0xBA,0x68,0x50,0x6C,0xB1,0xC5,0x94,0x33,0x19,0x9A,0x07,0x7A,0xB5,0x97,0x1F,0xC0,0x9C,0x1D,0x4F,0x5E,0xCD,0x7B,0x8E,0xBE,0xBF,0x90,0x8B,0x05, 25 | 0x75,0x4E,0x2D,0x23,0x8A,0x46,0x6F,0x15,0x83,0x0C,0x12,0xCE,0xC6,0xBA,0x13,0xA8,0xD1,0x30,0x91,0x21,0x8C,0x76,0x0F,0x34,0x34,0x8A,0x63,0x77,0xBA,0xCB,0x49,0xE4,0x05, 26 | 0x8B,0xCB,0x02,0xE9,0x37,0xD2,0x75,0xDA,0x99,0x67,0x5E,0x07,0x5A,0x5C,0x8D,0x48,0x29,0xAC,0x8A,0x23,0x58,0x50,0x01,0x19,0x0A,0x47,0x4B,0x60,0xB6,0xD7,0x02,0x3D,0x06, 27 | 0xA1,0x48,0xD8,0xAE,0xE5,0x5D,0x7C,0x9F,0xB0,0xC2,0xAA,0x40,0xED,0xFD,0x06,0xE9,0x80,0x27,0x84,0x25,0x24,0x2A,0xF3,0xFD,0xDF,0x03,0x33,0x49,0xB2,0xE3,0xBB,0x95,0x06, 28 | 0xB7,0xC5,0xAD,0x74,0x93,0xE9,0x82,0x64,0xC7,0x1D,0xF7,0x79,0x80,0x9F,0x80,0x89,0xD8,0xA2,0x7D,0x27,0xF0,0x03,0xE5,0xE2,0xB5,0xC0,0x1A,0x32,0xAE,0xEF,0x74,0xEE,0x06, 29 | 0xCD,0x42,0x83,0x3A,0x41,0x75,0x89,0x29,0xDE,0x78,0x43,0xB3,0x13,0x41,0xFA,0x29,0x30,0x1E,0x77,0x29,0xBC,0xDD,0xD6,0xC7,0x8B,0x7D,0x02,0x1B,0xAA,0xFB,0x2D,0x47,0x07, 30 | 0xE2,0xBF,0x58,0x00,0xEF,0x00,0x90,0xEE,0xF4,0xD3,0x8F,0xEC,0xA6,0xE2,0x73,0xCA,0x87,0x99,0x70,0x2B,0x88,0xB7,0xC8,0xAC,0x61,0x3A,0xEA,0x03,0xA6,0x07,0xE7,0x9F,0x07, 31 | 0xF8,0x3C,0x2E,0xC6,0x9C,0x8C,0x96,0xB3,0x0B,0x2F,0xDC,0x25,0x3A,0x84,0xED,0x6A,0xDF,0x14,0x6A,0x2D,0x54,0x91,0xBA,0x91,0x37,0xF7,0xD1,0xEC,0xA1,0x13,0xA0,0xF8,0x07, 32 | 0x0E,0xBA,0x03,0x8C,0x4A,0x18,0x9D,0x78,0x22,0x8A,0x28,0x5F,0xCD,0x25,0x67,0x0B,0x37,0x90,0x63,0x2F,0x20,0x6B,0xAC,0x76,0x0D,0xB4,0xB9,0xD5,0x9D,0x1F,0x59,0x51,0x08, 33 | 0x24,0x37,0xD9,0x51,0xF8,0xA3,0xA3,0x3D,0x39,0xE5,0x74,0x98,0x60,0xC7,0xE0,0xAB,0x8E,0x0B,0x5D,0x31,0xEC,0x44,0x9E,0x5B,0xE3,0x70,0xA1,0xBE,0x99,0x2B,0x12,0xAA,0x08, 34 | 0x3A,0xB4,0xAE,0x17,0xA6,0x2F,0xAA,0x02,0x50,0x40,0xC1,0xD1,0xF3,0x68,0x5A,0x4C,0xE6,0x86,0x56,0x33,0xB8,0x1E,0x90,0x40,0xB9,0x2D,0x89,0xA7,0x95,0x37,0xCB,0x02,0x09, 35 | 0x50,0x31,0x84,0xDD,0x53,0xBB,0xB0,0xC7,0x66,0x9B,0x0D,0x0B,0x87,0x0A,0xD4,0xEC,0x3D,0x02,0x50,0x35,0x84,0xF8,0x81,0x25,0x8F,0xEA,0x70,0x90,0x91,0x43,0x84,0x5B,0x09, 36 | 0x66,0xAE,0x59,0xA3,0x01,0x47,0xB7,0x8C,0x7D,0xF6,0x59,0x44,0x1A,0xAC,0x4D,0x8D,0x95,0x7D,0x49,0x37,0x50,0xD2,0x73,0x0A,0x65,0xA7,0x58,0x79,0x8D,0x4F,0x3D,0xB4,0x09, 37 | 0x7C,0x2B,0x2F,0x69,0xAF,0xD2,0xBD,0x51,0x94,0x51,0xA6,0x7D,0xAD,0x4D,0xC7,0x2D,0xED,0xF8,0x42,0x39,0x1C,0xAC,0x65,0xEF,0x3A,0x64,0x40,0x62,0x89,0x5B,0xF6,0x0C,0x0A, 38 | 0x92,0xA8,0x04,0x2F,0x5D,0x5E,0xC4,0x16,0xAB,0xAC,0xF2,0xB6,0x40,0xEF,0x40,0xCE,0x44,0x74,0x3C,0x3B,0xE8,0x85,0x57,0xD4,0x10,0x21,0x28,0x4B,0x85,0x67,0xAF,0x65,0x0A, 39 | 0xA8,0x25,0xDA,0xF4,0x0A,0xEA,0xCA,0xDB,0xC1,0x07,0x3F,0xF0,0xD3,0x90,0xBA,0x6E,0x9C,0xEF,0x35,0x3D,0xB4,0x5F,0x49,0xB9,0xE6,0xDD,0x0F,0x34,0x81,0x73,0x68,0xBE,0x0A, 40 | 0xBE,0xA2,0xAF,0xBA,0xB8,0x75,0xD1,0xA0,0xD8,0x62,0x8B,0x29,0x67,0x32,0x34,0x0F,0xF4,0x6A,0x2F,0x3F,0x80,0x39,0x3B,0x9E,0xBC,0x9A,0xF7,0x1C,0x7D,0x7F,0x21,0x17,0x0B, 41 | 0xD4,0x1F,0x85,0x80,0x66,0x01,0xD8,0x65,0xEF,0xBD,0xD7,0x62,0xFA,0xD3,0xAD,0xAF,0x4B,0xE6,0x28,0x41,0x4C,0x13,0x2D,0x83,0x92,0x57,0xDF,0x05,0x79,0x8B,0xDA,0x6F,0x0B, 42 | 0xEA,0x9C,0x5A,0x46,0x14,0x8D,0xDE,0x2A,0x06,0x19,0x24,0x9C,0x8D,0x75,0x27,0x50,0xA3,0x61,0x22,0x43,0x18,0xED,0x1E,0x68,0x68,0x14,0xC7,0xEE,0x74,0x97,0x93,0xC8,0x0B, 43 | 0x00,0x1A,0x30,0x0C,0xC2,0x18,0xE5,0xEF,0x1C,0x74,0x70,0xD5,0x20,0x17,0xA1,0xF0,0xFA,0xDC,0x1B,0x45,0xE4,0xC6,0x10,0x4D,0x3E,0xD1,0xAE,0xD7,0x70,0xA3,0x4C,0x21,0x0C, 44 | 0x16,0x97,0x05,0xD2,0x6F,0xA4,0xEB,0xB4,0x33,0xCF,0xBC,0x0E,0xB4,0xB8,0x1A,0x91,0x52,0x58,0x15,0x47,0xB0,0xA0,0x02,0x32,0x14,0x8E,0x96,0xC0,0x6C,0xAF,0x05,0x7A,0x0C, 45 | 0x2C,0x14,0xDB,0x97,0x1D,0x30,0xF2,0x79,0x4A,0x2A,0x09,0x48,0x47,0x5A,0x94,0x31,0xAA,0xD3,0x0E,0x49,0x7C,0x7A,0xF4,0x16,0xEA,0x4A,0x7E,0xA9,0x68,0xBB,0xBE,0xD2,0x0C, 46 | 0x42,0x91,0xB0,0x5D,0xCB,0xBB,0xF8,0x3E,0x61,0x85,0x55,0x81,0xDA,0xFB,0x0D,0xD2,0x01,0x4F,0x08,0x4B,0x48,0x54,0xE6,0xFB,0xBF,0x07,0x66,0x92,0x64,0xC7,0x77,0x2B,0x0D, 47 | 0x58,0x0E,0x86,0x23,0x79,0x47,0xFF,0x03,0x78,0xE0,0xA1,0xBA,0x6D,0x9D,0x87,0x72,0x59,0xCA,0x01,0x4D,0x14,0x2E,0xD8,0xE0,0x95,0xC4,0x4D,0x7B,0x60,0xD3,0x30,0x84,0x0D, 48 | 0x6E,0x8B,0x5B,0xE9,0x26,0xD3,0x05,0xC9,0x8E,0x3B,0xEE,0xF3,0x00,0x3F,0x01,0x13,0xB1,0x45,0xFB,0x4E,0xE0,0x07,0xCA,0xC5,0x6B,0x81,0x35,0x64,0x5C,0xDF,0xE9,0xDC,0x0D, 49 | 0x84,0x08,0x31,0xAF,0xD4,0x5E,0x0C,0x8E,0xA5,0x96,0x3A,0x2D,0x94,0xE0,0x7A,0xB3,0x08,0xC1,0xF4,0x50,0xAC,0xE1,0xBB,0xAA,0x41,0x3E,0x1D,0x4D,0x58,0xEB,0xA2,0x35,0x0E, 50 | 0x9A,0x85,0x06,0x75,0x82,0xEA,0x12,0x53,0xBC,0xF1,0x86,0x66,0x27,0x82,0xF4,0x53,0x60,0x3C,0xEE,0x52,0x78,0xBB,0xAD,0x8F,0x17,0xFB,0x04,0x36,0x54,0xF7,0x5B,0x8E,0x0E, 51 | 0xAF,0x02,0xDC,0x3A,0x30,0x76,0x19,0x18,0xD3,0x4C,0xD3,0x9F,0xBA,0x23,0x6E,0xF4,0xB7,0xB7,0xE7,0x54,0x44,0x95,0x9F,0x74,0xED,0xB7,0xEC,0x1E,0x50,0x03,0x15,0xE7,0x0E, 52 | 0xC5,0x7F,0xB1,0x00,0xDE,0x01,0x20,0xDD,0xE9,0xA7,0x1F,0xD9,0x4D,0xC5,0xE7,0x94,0x0F,0x33,0xE1,0x56,0x10,0x6F,0x91,0x59,0xC3,0x74,0xD4,0x07,0x4C,0x0F,0xCE,0x3F,0x0F, 53 | 0xDB,0xFC,0x86,0xC6,0x8B,0x8D,0x26,0xA2,0x00,0x03,0x6C,0x12,0xE1,0x66,0x61,0x35,0x67,0xAE,0xDA,0x58,0xDC,0x48,0x83,0x3E,0x99,0x31,0xBC,0xF0,0x47,0x1B,0x87,0x98,0x0F, 54 | 0xF1,0x79,0x5C,0x8C,0x39,0x19,0x2D,0x67,0x17,0x5E,0xB8,0x4B,0x74,0x08,0xDB,0xD5,0xBE,0x29,0xD4,0x5A,0xA8,0x22,0x75,0x23,0x6F,0xEE,0xA3,0xD9,0x43,0x27,0x40,0xF1,0x0F, 55 | 0x07,0xF7,0x31,0x52,0xE7,0xA4,0x33,0x2C,0x2E,0xB9,0x04,0x85,0x07,0xAA,0x54,0x76,0x16,0xA5,0xCD,0x5C,0x74,0xFC,0x66,0x08,0x45,0xAB,0x8B,0xC2,0x3F,0x33,0xF9,0x49,0x10, 56 | 0x1D,0x74,0x07,0x18,0x95,0x30,0x3A,0xF1,0x44,0x14,0x51,0xBE,0x9A,0x4B,0xCE,0x16,0x6E,0x20,0xC7,0x5E,0x40,0xD6,0x58,0xED,0x1A,0x68,0x73,0xAB,0x3B,0x3F,0xB2,0xA2,0x10, 57 | 0x33,0xF1,0xDC,0xDD,0x42,0xBC,0x40,0xB6,0x5B,0x6F,0x9D,0xF7,0x2D,0xED,0x47,0xB7,0xC5,0x9B,0xC0,0x60,0x0C,0xB0,0x4A,0xD2,0xF0,0x24,0x5B,0x94,0x37,0x4B,0x6B,0xFB,0x10, 58 | 0x49,0x6E,0xB2,0xA3,0xF0,0x47,0x47,0x7B,0x72,0xCA,0xE9,0x30,0xC1,0x8E,0xC1,0x57,0x1D,0x17,0xBA,0x62,0xD8,0x89,0x3C,0xB7,0xC6,0xE1,0x42,0x7D,0x33,0x57,0x24,0x54,0x11, 59 | 0x5F,0xEB,0x87,0x69,0x9E,0xD3,0x4D,0x40,0x89,0x25,0x36,0x6A,0x54,0x30,0x3B,0xF8,0x74,0x92,0xB3,0x64,0xA4,0x63,0x2E,0x9C,0x9C,0x9E,0x2A,0x66,0x2F,0x63,0xDD,0xAC,0x11, 60 | 0x75,0x68,0x5D,0x2F,0x4C,0x5F,0x54,0x05,0xA0,0x80,0x82,0xA3,0xE7,0xD1,0xB4,0x98,0xCC,0x0D,0xAD,0x66,0x70,0x3D,0x20,0x81,0x72,0x5B,0x12,0x4F,0x2B,0x6F,0x96,0x05,0x12, 61 | 0x8B,0xE5,0x32,0xF5,0xF9,0xEA,0x5A,0xCA,0xB6,0xDB,0xCE,0xDC,0x7A,0x73,0x2E,0x39,0x24,0x89,0xA6,0x68,0x3C,0x17,0x12,0x66,0x48,0x18,0xFA,0x37,0x27,0x7B,0x4F,0x5E,0x12, 62 | 0xA1,0x62,0x08,0xBB,0xA7,0x76,0x61,0x8F,0xCD,0x36,0x1B,0x16,0x0E,0x15,0xA8,0xD9,0x7B,0x04,0xA0,0x6A,0x08,0xF1,0x03,0x4B,0x1E,0xD5,0xE1,0x20,0x23,0x87,0x08,0xB7,0x12, 63 | 0xB7,0xDF,0xDD,0x80,0x55,0x02,0x68,0x54,0xE4,0x91,0x67,0x4F,0xA1,0xB6,0x21,0x7A,0xD3,0x7F,0x99,0x6C,0xD4,0xCA,0xF5,0x2F,0xF4,0x91,0xC9,0x09,0x1F,0x93,0xC1,0x0F,0x13, 64 | 0xCD,0x5C,0xB3,0x46,0x03,0x8E,0x6E,0x19,0xFB,0xEC,0xB3,0x88,0x34,0x58,0x9B,0x1A,0x2B,0xFB,0x92,0x6E,0xA0,0xA4,0xE7,0x14,0xCA,0x4E,0xB1,0xF2,0x1A,0x9F,0x7A,0x68,0x13, 65 | 0xE3,0xD9,0x88,0x0C,0xB1,0x19,0x75,0xDE,0x11,0x48,0x00,0xC2,0xC7,0xF9,0x14,0xBB,0x82,0x76,0x8C,0x70,0x6C,0x7E,0xD9,0xF9,0x9F,0x0B,0x99,0xDB,0x16,0xAB,0x33,0xC1,0x13, 66 | 0xF9,0x56,0x5E,0xD2,0x5E,0xA5,0x7B,0xA3,0x28,0xA3,0x4C,0xFB,0x5A,0x9B,0x8E,0x5B,0xDA,0xF1,0x85,0x72,0x38,0x58,0xCB,0xDE,0x75,0xC8,0x80,0xC4,0x12,0xB7,0xEC,0x19,0x14, 67 | 0x0F,0xD4,0x33,0x98,0x0C,0x31,0x82,0x68,0x3F,0xFE,0x98,0x34,0xEE,0x3C,0x08,0xFC,0x31,0x6D,0x7F,0x74,0x04,0x32,0xBD,0xC3,0x4B,0x85,0x68,0xAD,0x0E,0xC3,0xA5,0x72,0x14, 68 | 0x25,0x51,0x09,0x5E,0xBA,0xBC,0x88,0x2D,0x56,0x59,0xE5,0x6D,0x81,0xDE,0x81,0x9C,0x89,0xE8,0x78,0x76,0xD0,0x0B,0xAF,0xA8,0x21,0x42,0x50,0x96,0x0A,0xCF,0x5E,0xCB,0x14, 69 | 0x3B,0xCE,0xDE,0x23,0x68,0x48,0x8F,0xF2,0x6C,0xB4,0x31,0xA7,0x14,0x80,0xFB,0x3C,0xE1,0x63,0x72,0x78,0x9C,0xE5,0xA0,0x8D,0xF7,0xFE,0x37,0x7F,0x06,0xDB,0x17,0x24,0x15, 70 | 0x51,0x4B,0xB4,0xE9,0x15,0xD4,0x95,0xB7,0x83,0x0F,0x7E,0xE0,0xA7,0x21,0x75,0xDD,0x38,0xDF,0x6B,0x7A,0x68,0xBF,0x92,0x72,0xCD,0xBB,0x1F,0x68,0x02,0xE7,0xD0,0x7C,0x15, 71 | 0x67,0xC8,0x89,0xAF,0xC3,0x5F,0x9C,0x7C,0x9A,0x6A,0xCA,0x19,0x3B,0xC3,0xEE,0x7D,0x90,0x5A,0x65,0x7C,0x34,0x99,0x84,0x57,0xA3,0x78,0x07,0x51,0xFE,0xF2,0x89,0xD5,0x15, 72 | 0x7C,0x45,0x5F,0x75,0x71,0xEB,0xA2,0x41,0xB1,0xC5,0x16,0x53,0xCE,0x64,0x68,0x1E,0xE8,0xD5,0x5E,0x7E,0x00,0x73,0x76,0x3C,0x79,0x35,0xEF,0x39,0xFA,0xFE,0x42,0x2E,0x16, 73 | 0x92,0xC2,0x34,0x3B,0x1F,0x77,0xA9,0x06,0xC8,0x20,0x63,0x8C,0x61,0x06,0xE2,0xBE,0x3F,0x51,0x58,0x80,0xCC,0x4C,0x68,0x21,0x4F,0xF2,0xD6,0x22,0xF6,0x0A,0xFC,0x86,0x16, 74 | 0xA8,0x3F,0x0A,0x01,0xCD,0x02,0xB0,0xCB,0xDE,0x7B,0xAF,0xC5,0xF4,0xA7,0x5B,0x5F,0x97,0xCC,0x51,0x82,0x98,0x26,0x5A,0x06,0x25,0xAF,0xBE,0x0B,0xF2,0x16,0xB5,0xDF,0x16, 75 | 0xBE,0xBC,0xDF,0xC6,0x7A,0x8E,0xB6,0x90,0xF5,0xD6,0xFB,0xFE,0x87,0x49,0xD5,0xFF,0xEE,0x47,0x4B,0x84,0x64,0x00,0x4C,0xEB,0xFA,0x6B,0xA6,0xF4,0xED,0x22,0x6E,0x38,0x17, 76 | 0xD4,0x39,0xB5,0x8C,0x28,0x1A,0xBD,0x55,0x0C,0x32,0x48,0x38,0x1B,0xEB,0x4E,0xA0,0x46,0xC3,0x44,0x86,0x30,0xDA,0x3D,0xD0,0xD0,0x28,0x8E,0xDD,0xE9,0x2E,0x27,0x91,0x17, 77 | 0xEA,0xB6,0x8A,0x52,0xD6,0xA5,0xC3,0x1A,0x23,0x8D,0x94,0x71,0xAE,0x8C,0xC8,0x40,0x9E,0x3E,0x3E,0x88,0xFC,0xB3,0x2F,0xB5,0xA6,0xE5,0x75,0xC6,0xE5,0x3A,0xE0,0xE9,0x17, 78 | 0x00,0x34,0x60,0x18,0x84,0x31,0xCA,0xDF,0x39,0xE8,0xE0,0xAA,0x41,0x2E,0x42,0xE1,0xF5,0xB9,0x37,0x8A,0xC8,0x8D,0x21,0x9A,0x7C,0xA2,0x5D,0xAF,0xE1,0x46,0x99,0x42,0x18, 79 | 0x16,0xB1,0x35,0xDE,0x31,0xBD,0xD0,0xA4,0x50,0x43,0x2D,0xE4,0xD4,0xCF,0xBB,0x81,0x4D,0x35,0x31,0x8C,0x94,0x67,0x13,0x7F,0x52,0x5F,0x45,0x98,0xDD,0x52,0x52,0x9B,0x18, 80 | 0x2C,0x2E,0x0B,0xA4,0xDF,0x48,0xD7,0x69,0x67,0x9E,0x79,0x1D,0x68,0x71,0x35,0x22,0xA5,0xB0,0x2A,0x8E,0x60,0x41,0x05,0x64,0x28,0x1C,0x2D,0x81,0xD9,0x5E,0x0B,0xF4,0x18, 81 | 0x42,0xAB,0xE0,0x69,0x8D,0xD4,0xDD,0x2E,0x7E,0xF9,0xC5,0x56,0xFB,0x12,0xAF,0xC2,0xFC,0x2B,0x24,0x90,0x2C,0x1B,0xF7,0x48,0xFE,0xD8,0x14,0x6A,0xD5,0x6A,0xC4,0x4C,0x19, 82 | 0x58,0x28,0xB6,0x2F,0x3B,0x60,0xE4,0xF3,0x94,0x54,0x12,0x90,0x8E,0xB4,0x28,0x63,0x54,0xA7,0x1D,0x92,0xF8,0xF4,0xE8,0x2D,0xD4,0x95,0xFC,0x52,0xD1,0x76,0x7D,0xA5,0x19, 83 | 0x6E,0xA5,0x8B,0xF5,0xE8,0xEB,0xEA,0xB8,0xAB,0xAF,0x5E,0xC9,0x21,0x56,0xA2,0x03,0xAC,0x22,0x17,0x94,0xC4,0xCE,0xDA,0x12,0xAA,0x52,0xE4,0x3B,0xCD,0x82,0x36,0xFE,0x19, 84 | 0x84,0x22,0x61,0xBB,0x96,0x77,0xF1,0x7D,0xC2,0x0A,0xAB,0x02,0xB5,0xF7,0x1B,0xA4,0x03,0x9E,0x10,0x96,0x90,0xA8,0xCC,0xF7,0x7F,0x0F,0xCC,0x24,0xC9,0x8E,0xEF,0x56,0x1A, 85 | 0x9A,0x9F,0x36,0x81,0x44,0x03,0xF8,0x42,0xD9,0x65,0xF7,0x3B,0x48,0x99,0x95,0x44,0x5B,0x19,0x0A,0x98,0x5C,0x82,0xBE,0xDC,0x55,0xCC,0xB3,0x0D,0xC5,0x9A,0xA8,0xAF,0x1A, 86 | 0xB0,0x1C,0x0C,0x47,0xF2,0x8E,0xFE,0x07,0xF0,0xC0,0x43,0x75,0xDB,0x3A,0x0F,0xE5,0xB2,0x94,0x03,0x9A,0x28,0x5C,0xB0,0xC1,0x2B,0x89,0x9B,0xF6,0xC0,0xA6,0x61,0x08,0x1B, 87 | 0xC6,0x99,0xE1,0x0C,0xA0,0x1A,0x05,0xCD,0x06,0x1C,0x90,0xAE,0x6E,0xDC,0x88,0x85,0x0A,0x10,0xFD,0x9B,0xF4,0x35,0xA2,0xA6,0x01,0x46,0x83,0xDF,0xBC,0xB2,0x1A,0x61,0x1B, 88 | 0xDC,0x16,0xB7,0xD2,0x4D,0xA6,0x0B,0x92,0x1D,0x77,0xDC,0xE7,0x01,0x7E,0x02,0x26,0x62,0x8B,0xF6,0x9D,0xC0,0x0F,0x94,0x8B,0xD7,0x02,0x6B,0xC8,0xB8,0xBE,0xD3,0xB9,0x1B, 89 | 0xF2,0x93,0x8C,0x98,0xFB,0x31,0x12,0x57,0x34,0xD2,0x28,0x21,0x95,0x1F,0x7C,0xC6,0xB9,0x06,0xF0,0x9F,0x8C,0xE9,0x85,0x70,0xAD,0xBF,0x52,0xB1,0xB4,0xCA,0x8C,0x12,0x1C, 90 | 0x08,0x11,0x62,0x5E,0xA9,0xBD,0x18,0x1C,0x4B,0x2D,0x75,0x5A,0x28,0xC1,0xF5,0x66,0x11,0x82,0xE9,0xA1,0x58,0xC3,0x77,0x55,0x83,0x7C,0x3A,0x9A,0xB0,0xD6,0x45,0x6B,0x1C, 91 | 0x1E,0x8E,0x37,0x24,0x57,0x49,0x1F,0xE1,0x61,0x88,0xC1,0x93,0xBB,0x62,0x6F,0x07,0x69,0xFD,0xE2,0xA3,0x24,0x9D,0x69,0x3A,0x59,0x39,0x22,0x83,0xAC,0xE2,0xFE,0xC3,0x1C, 92 | 0x34,0x0B,0x0D,0xEA,0x04,0xD5,0x25,0xA6,0x78,0xE3,0x0D,0xCD,0x4E,0x04,0xE9,0xA7,0xC0,0x78,0xDC,0xA5,0xF0,0x76,0x5B,0x1F,0x2F,0xF6,0x09,0x6C,0xA8,0xEE,0xB7,0x1C,0x1D, 93 | 0x49,0x88,0xE2,0xAF,0xB2,0x60,0x2C,0x6B,0x8F,0x3E,0x5A,0x06,0xE2,0xA5,0x62,0x48,0x18,0xF4,0xD5,0xA7,0xBC,0x50,0x4D,0x04,0x05,0xB3,0xF1,0x54,0xA4,0xFA,0x70,0x75,0x1D, 94 | 0x5F,0x05,0xB8,0x75,0x60,0xEC,0x32,0x30,0xA6,0x99,0xA6,0x3F,0x75,0x47,0xDC,0xE8,0x6F,0x6F,0xCF,0xA9,0x88,0x2A,0x3F,0xE9,0xDA,0x6F,0xD9,0x3D,0xA0,0x06,0x2A,0xCE,0x1D, 95 | 0x75,0x82,0x8D,0x3B,0x0E,0x78,0x39,0xF5,0xBC,0xF4,0xF2,0x78,0x08,0xE9,0x55,0x89,0xC7,0xEA,0xC8,0xAB,0x54,0x04,0x31,0xCE,0xB0,0x2C,0xC1,0x26,0x9C,0x12,0xE3,0x26,0x1E, 96 | 0x8B,0xFF,0x62,0x01,0xBC,0x03,0x40,0xBA,0xD3,0x4F,0x3F,0xB2,0x9B,0x8A,0xCF,0x29,0x1F,0x66,0xC2,0xAD,0x20,0xDE,0x22,0xB3,0x86,0xE9,0xA8,0x0F,0x98,0x1E,0x9C,0x7F,0x1E, 97 | 0xA1,0x7C,0x38,0xC7,0x69,0x8F,0x46,0x7F,0xEA,0xAA,0x8B,0xEB,0x2E,0x2C,0x49,0xCA,0x76,0xE1,0xBB,0xAF,0xEC,0xB7,0x14,0x98,0x5C,0xA6,0x90,0xF8,0x93,0x2A,0x55,0xD8,0x1E, 98 | 0xB7,0xF9,0x0D,0x8D,0x17,0x1B,0x4D,0x44,0x01,0x06,0xD8,0x24,0xC2,0xCD,0xC2,0x6A,0xCE,0x5C,0xB5,0xB1,0xB8,0x91,0x06,0x7D,0x32,0x63,0x78,0xE1,0x8F,0x36,0x0E,0x31,0x1F, 99 | 0xCD,0x76,0xE3,0x52,0xC5,0xA6,0x53,0x09,0x18,0x61,0x24,0x5E,0x55,0x6F,0x3C,0x0B,0x26,0xD8,0xAE,0xB3,0x84,0x6B,0xF8,0x61,0x08,0x20,0x60,0xCA,0x8B,0x42,0xC7,0x89,0x1F, 100 | 0xE3,0xF3,0xB8,0x18,0x73,0x32,0x5A,0xCE,0x2E,0xBC,0x70,0x97,0xE8,0x10,0xB6,0xAB,0x7D,0x53,0xA8,0xB5,0x50,0x45,0xEA,0x46,0xDE,0xDC,0x47,0xB3,0x87,0x4E,0x80,0xE2,0x1F, 101 | 0xF9,0x70,0x8E,0xDE,0x20,0xBE,0x60,0x93,0x45,0x17,0xBD,0xD0,0x7B,0xB2,0x2F,0x4C,0xD5,0xCE,0xA1,0xB7,0x1C,0x1F,0xDC,0x2B,0xB4,0x99,0x2F,0x9C,0x83,0x5A,0x39,0x3B,0x20, 102 | 0x0F,0xEE,0x63,0xA4,0xCE,0x49,0x67,0x58,0x5C,0x72,0x09,0x0A,0x0F,0x54,0xA9,0xEC,0x2C,0x4A,0x9B,0xB9,0xE8,0xF8,0xCD,0x10,0x8A,0x56,0x17,0x85,0x7F,0x66,0xF2,0x93,0x20, 103 | 0x25,0x6B,0x39,0x6A,0x7C,0xD5,0x6D,0x1D,0x73,0xCD,0x55,0x43,0xA2,0xF5,0x22,0x8D,0x84,0xC5,0x94,0xBB,0xB4,0xD2,0xBF,0xF5,0x5F,0x13,0xFF,0x6D,0x7B,0x72,0xAB,0xEC,0x20, 104 | 0x3B,0xE8,0x0E,0x30,0x2A,0x61,0x74,0xE2,0x89,0x28,0xA2,0x7C,0x35,0x97,0x9C,0x2D,0xDC,0x40,0x8E,0xBD,0x80,0xAC,0xB1,0xDA,0x35,0xD0,0xE6,0x56,0x77,0x7E,0x64,0x45,0x21, 105 | 0x51,0x65,0xE4,0xF5,0xD7,0xEC,0x7A,0xA7,0xA0,0x83,0xEE,0xB5,0xC8,0x38,0x16,0xCE,0x33,0xBC,0x87,0xBF,0x4C,0x86,0xA3,0xBF,0x0B,0x8D,0xCE,0x3F,0x73,0x8A,0x1D,0x9E,0x21, 106 | 0x67,0xE2,0xB9,0xBB,0x85,0x78,0x81,0x6C,0xB7,0xDE,0x3A,0xEF,0x5B,0xDA,0x8F,0x6E,0x8B,0x37,0x81,0xC1,0x18,0x60,0x95,0xA4,0xE1,0x49,0xB6,0x28,0x6F,0x96,0xD6,0xF6,0x21, 107 | 0x7D,0x5F,0x8F,0x81,0x33,0x04,0x88,0x31,0xCE,0x39,0x87,0x28,0xEF,0x7B,0x09,0x0F,0xE3,0xB2,0x7A,0xC3,0xE4,0x39,0x87,0x89,0xB7,0x06,0x9E,0x11,0x6B,0xA2,0x8F,0x4F,0x22, 108 | 0x93,0xDC,0x64,0x47,0xE1,0x8F,0x8E,0xF6,0xE4,0x94,0xD3,0x61,0x82,0x1D,0x83,0xAF,0x3A,0x2E,0x74,0xC5,0xB0,0x13,0x79,0x6E,0x8D,0xC3,0x85,0xFA,0x66,0xAE,0x48,0xA8,0x22, 109 | 0xA9,0x59,0x3A,0x0D,0x8F,0x1B,0x95,0xBB,0xFB,0xEF,0x1F,0x9B,0x15,0xBF,0xFC,0x4F,0x92,0xA9,0x6D,0xC7,0x7C,0xED,0x6A,0x53,0x63,0x80,0x6D,0xE3,0x62,0xBA,0x01,0x01,0x23, 110 | 0xBF,0xD6,0x0F,0xD3,0x3C,0xA7,0x9B,0x80,0x12,0x4B,0x6C,0xD4,0xA8,0x60,0x76,0xF0,0xE9,0x24,0x67,0xC9,0x48,0xC7,0x5C,0x38,0x39,0x3D,0x55,0xCC,0x5E,0xC6,0xBA,0x59,0x23, 111 | 0xD5,0x53,0xE5,0x98,0xEA,0x32,0xA2,0x45,0x29,0xA6,0xB8,0x0D,0x3C,0x02,0xF0,0x90,0x41,0xA0,0x60,0xCB,0x14,0xA1,0x4E,0x1D,0x0F,0xFA,0x3C,0xB5,0x5A,0xD2,0x73,0xB2,0x23, 112 | 0xEB,0xD0,0xBA,0x5E,0x98,0xBE,0xA8,0x0A,0x40,0x01,0x05,0x47,0xCF,0xA3,0x69,0x31,0x99,0x1B,0x5A,0xCD,0xE0,0x7A,0x40,0x02,0xE5,0xB6,0x24,0x9E,0x56,0xDE,0x2C,0x0B,0x24, 113 | 0x01,0x4E,0x90,0x24,0x46,0x4A,0xAF,0xCF,0x56,0x5C,0x51,0x80,0x62,0x45,0xE3,0xD1,0xF0,0x96,0x53,0xCF,0xAC,0x54,0x32,0xE7,0xBA,0x73,0x0C,0x87,0x52,0xEA,0xE5,0x63,0x24, 114 | 0x16,0xCB,0x65,0xEA,0xF3,0xD5,0xB5,0x94,0x6D,0xB7,0x9D,0xB9,0xF5,0xE6,0x5C,0x72,0x48,0x12,0x4D,0xD1,0x78,0x2E,0x24,0xCC,0x90,0x30,0xF4,0x6F,0x4E,0xF6,0x9E,0xBC,0x24, 115 | 0x2C,0x48,0x3B,0xB0,0xA1,0x61,0xBC,0x59,0x84,0x12,0xEA,0xF2,0x88,0x88,0xD6,0x12,0xA0,0x8D,0x46,0xD3,0x44,0x08,0x16,0xB1,0x66,0xED,0xDB,0x58,0x4A,0x02,0x58,0x15,0x25, 116 | 0x42,0xC5,0x10,0x76,0x4F,0xED,0xC2,0x1E,0x9B,0x6D,0x36,0x2C,0x1C,0x2A,0x50,0xB3,0xF7,0x08,0x40,0xD5,0x10,0xE2,0x07,0x96,0x3C,0xAA,0xC3,0x41,0x46,0x0E,0x11,0x6E,0x25, 117 | 0x58,0x42,0xE6,0x3B,0xFD,0x78,0xC9,0xE3,0xB1,0xC8,0x82,0x65,0xAF,0xCB,0xC9,0x53,0x4F,0x84,0x39,0xD7,0xDC,0xBB,0xF9,0x7A,0x12,0x67,0xAB,0x2A,0x42,0x1A,0xCA,0xC6,0x25, 118 | 0x6E,0xBF,0xBB,0x01,0xAB,0x04,0xD0,0xA8,0xC8,0x23,0xCF,0x9E,0x42,0x6D,0x43,0xF4,0xA6,0xFF,0x32,0xD9,0xA8,0x95,0xEB,0x5F,0xE8,0x23,0x93,0x13,0x3E,0x26,0x83,0x1F,0x26, 119 | 0x84,0x3C,0x91,0xC7,0x58,0x90,0xD6,0x6D,0xDF,0x7E,0x1B,0xD8,0xD5,0x0E,0xBD,0x94,0xFE,0x7A,0x2C,0xDB,0x74,0x6F,0xDD,0x44,0xBE,0xE0,0x7A,0xFC,0x39,0x32,0x3C,0x78,0x26, 120 | 0x9A,0xB9,0x66,0x8D,0x06,0x1C,0xDD,0x32,0xF6,0xD9,0x67,0x11,0x69,0xB0,0x36,0x35,0x56,0xF6,0x25,0xDD,0x40,0x49,0xCF,0x29,0x94,0x9D,0x62,0xE5,0x35,0x3E,0xF5,0xD0,0x26, 121 | 0xB0,0x36,0x3C,0x53,0xB4,0xA7,0xE3,0xF7,0x0C,0x35,0xB4,0x4A,0xFC,0x51,0xB0,0xD5,0xAD,0x71,0x1F,0xDF,0x0C,0x23,0xC1,0x0E,0x6A,0x5A,0x4A,0xCE,0x31,0x4A,0xAE,0x29,0x27, 122 | 0xC6,0xB3,0x11,0x19,0x62,0x33,0xEA,0xBC,0x23,0x90,0x00,0x84,0x8F,0xF3,0x29,0x76,0x05,0xED,0x18,0xE1,0xD8,0xFC,0xB2,0xF3,0x3F,0x17,0x32,0xB7,0x2D,0x56,0x67,0x82,0x27, 123 | 0xDC,0x30,0xE7,0xDE,0x0F,0xBF,0xF0,0x81,0x3A,0xEB,0x4C,0xBD,0x22,0x95,0xA3,0x16,0x5D,0x68,0x12,0xE3,0xA4,0xD6,0xA4,0xD8,0x15,0xD4,0x19,0xA0,0x29,0x62,0x20,0xDB,0x27, 124 | 0xF2,0xAD,0xBC,0xA4,0xBD,0x4A,0xF7,0x46,0x51,0x46,0x99,0xF6,0xB5,0x36,0x1D,0xB7,0xB4,0xE3,0x0B,0xE5,0x70,0xB0,0x96,0xBD,0xEB,0x90,0x01,0x89,0x25,0x6E,0xD9,0x33,0x28, 125 | 0x08,0x2B,0x92,0x6A,0x6B,0xD6,0xFD,0x0B,0x68,0xA1,0xE5,0x2F,0x49,0xD8,0x96,0x57,0x0C,0x5F,0x05,0xE7,0x3C,0x8A,0x88,0xA2,0xC1,0x4D,0xE9,0x71,0x21,0x7A,0x92,0x8C,0x28, 126 | 0x1E,0xA8,0x67,0x30,0x19,0x62,0x04,0xD1,0x7E,0xFC,0x31,0x69,0xDC,0x79,0x10,0xF8,0x63,0xDA,0xFE,0xE8,0x08,0x64,0x7A,0x87,0x97,0x0A,0xD1,0x5A,0x1D,0x86,0x4B,0xE5,0x28, 127 | 0x34,0x25,0x3D,0xF6,0xC6,0xED,0x0A,0x96,0x95,0x57,0x7E,0xA2,0x6F,0x1B,0x8A,0x98,0xBB,0x55,0xF8,0xEA,0xD4,0x3D,0x6C,0x6C,0x6D,0xC7,0xB8,0x43,0x19,0x92,0x04,0x3E,0x29, 128 | 0x4A,0xA2,0x12,0xBC,0x74,0x79,0x11,0x5B,0xAC,0xB2,0xCA,0xDB,0x02,0xBD,0x03,0x39,0x13,0xD1,0xF1,0xEC,0xA0,0x17,0x5E,0x51,0x43,0x84,0xA0,0x2C,0x15,0x9E,0xBD,0x96,0x29, 129 | 0x60,0x1F,0xE8,0x81,0x22,0x05,0x18,0x20,0xC3,0x0D,0x17,0x15,0x96,0x5E,0x7D,0xD9,0x6A,0x4C,0xEB,0xEE,0x6C,0xF1,0x4F,0x36,0x19,0x41,0x88,0x15,0x11,0xAA,0x76,0xEF,0x29, 130 | 0x76,0x9C,0xBD,0x47,0xD0,0x90,0x1E,0xE5,0xD9,0x68,0x63,0x4E,0x29,0x00,0xF7,0x79,0xC2,0xC7,0xE4,0xF0,0x38,0xCB,0x41,0x1B,0xEF,0xFD,0x6F,0xFE,0x0C,0xB6,0x2F,0x48,0x2A, 131 | 0x8C,0x19,0x93,0x0D,0x7E,0x1C,0x25,0xAA,0xF0,0xC3,0xAF,0x87,0xBC,0xA1,0x70,0x1A,0x1A,0x43,0xDE,0xF2,0x04,0xA5,0x33,0x00,0xC5,0xBA,0x57,0xE7,0x08,0xC2,0xE8,0xA0,0x2A, 132 | 0xA2,0x96,0x68,0xD3,0x2B,0xA8,0x2B,0x6F,0x07,0x1F,0xFC,0xC0,0x4F,0x43,0xEA,0xBA,0x71,0xBE,0xD7,0xF4,0xD0,0x7E,0x25,0xE5,0x9A,0x77,0x3F,0xD0,0x04,0xCE,0xA1,0xF9,0x2A, 133 | 0xB8,0x13,0x3E,0x99,0xD9,0x33,0x32,0x34,0x1E,0x7A,0x48,0xFA,0xE2,0xE4,0x63,0x5B,0xC9,0x39,0xD1,0xF6,0x9C,0x58,0x17,0xCA,0x70,0x34,0x27,0xB9,0x00,0xDA,0x5A,0x52,0x2B, 134 | 0xCE,0x90,0x13,0x5F,0x87,0xBF,0x38,0xF9,0x34,0xD5,0x94,0x33,0x76,0x86,0xDD,0xFB,0x20,0xB5,0xCA,0xF8,0x68,0x32,0x09,0xAF,0x46,0xF1,0x0E,0xA2,0xFC,0xE5,0x13,0xAB,0x2B, 135 | 0xE3,0x0D,0xE9,0x24,0x35,0x4B,0x3F,0xBE,0x4B,0x30,0xE1,0x6C,0x09,0x28,0x57,0x9C,0x78,0x30,0xC4,0xFA,0x34,0x0C,0xFB,0x93,0x1C,0xAE,0xF6,0x8A,0xF8,0xF1,0xCC,0x03,0x2C, 136 | 0xF9,0x8A,0xBE,0xEA,0xE2,0xD6,0x45,0x83,0x62,0x8B,0x2D,0xA6,0x9C,0xC9,0xD0,0x3C,0xD0,0xAB,0xBD,0xFC,0x00,0xE6,0xEC,0x78,0xF2,0x6A,0xDE,0x73,0xF4,0xFD,0x85,0x5C,0x2C, 137 | 0x0F,0x08,0x94,0xB0,0x90,0x62,0x4C,0x48,0x79,0xE6,0x79,0xDF,0x2F,0x6B,0x4A,0xDD,0x27,0x27,0xB7,0xFE,0xCC,0xBF,0xDE,0x5D,0xC8,0x27,0xC6,0x5C,0xF0,0x09,0x3F,0xB5,0x2C, 138 | 0x25,0x85,0x69,0x76,0x3E,0xEE,0x52,0x0D,0x90,0x41,0xC6,0x18,0xC3,0x0C,0xC4,0x7D,0x7F,0xA2,0xB0,0x00,0x99,0x99,0xD0,0x42,0x9E,0xE4,0xAD,0x45,0xEC,0x15,0xF8,0x0D,0x2D, 139 | 0x3B,0x02,0x3F,0x3C,0xEC,0x79,0x59,0xD2,0xA6,0x9C,0x12,0x52,0x56,0xAE,0x3D,0x1E,0xD7,0x1D,0xAA,0x02,0x65,0x73,0xC2,0x27,0x74,0xA1,0x95,0x2E,0xE8,0x21,0xB1,0x66,0x2D, 140 | 0x51,0x7F,0x14,0x02,0x9A,0x05,0x60,0x97,0xBD,0xF7,0x5E,0x8B,0xE9,0x4F,0xB7,0xBE,0x2E,0x99,0xA3,0x04,0x31,0x4D,0xB4,0x0C,0x4A,0x5E,0x7D,0x17,0xE4,0x2D,0x6A,0xBF,0x2D, 141 | 0x67,0xFC,0xE9,0xC7,0x47,0x91,0x66,0x5C,0xD4,0x52,0xAB,0xC4,0x7C,0xF1,0x30,0x5F,0x86,0x14,0x9D,0x06,0xFD,0x26,0xA6,0xF1,0x1F,0x1B,0x65,0x00,0xE0,0x39,0x23,0x18,0x2E, 142 | 0x7D,0x79,0xBF,0x8D,0xF5,0x1C,0x6D,0x21,0xEB,0xAD,0xF7,0xFD,0x0F,0x93,0xAA,0xFF,0xDD,0x8F,0x96,0x08,0xC9,0x00,0x98,0xD6,0xF5,0xD7,0x4C,0xE9,0xDB,0x45,0xDC,0x70,0x2E, 143 | 0x93,0xF6,0x94,0x53,0xA3,0xA8,0x73,0xE6,0x01,0x09,0x44,0x37,0xA3,0x34,0x24,0xA0,0x35,0x0B,0x90,0x0A,0x95,0xDA,0x89,0xBB,0xCB,0x94,0x34,0xD2,0xD7,0x51,0x95,0xC9,0x2E, 144 | 0xA9,0x73,0x6A,0x19,0x51,0x34,0x7A,0xAB,0x18,0x64,0x90,0x70,0x36,0xD6,0x9D,0x40,0x8D,0x86,0x89,0x0C,0x61,0xB4,0x7B,0xA0,0xA1,0x51,0x1C,0xBB,0xD3,0x5D,0x4E,0x22,0x2F, 145 | 0xBF,0xF0,0x3F,0xDF,0xFE,0xBF,0x80,0x70,0x2F,0xBF,0xDC,0xA9,0xC9,0x77,0x17,0xE1,0xE4,0x01,0x83,0x0E,0x2D,0x8E,0x6D,0x85,0x77,0x0E,0x04,0xA4,0xCF,0x69,0x07,0x7B,0x2F, 146 | 0xD5,0x6D,0x15,0xA5,0xAC,0x4B,0x87,0x35,0x46,0x1A,0x29,0xE3,0x5C,0x19,0x91,0x81,0x3C,0x7D,0x7C,0x10,0xF9,0x67,0x5F,0x6A,0x4D,0xCB,0xEB,0x8C,0xCB,0x75,0xC0,0xD3,0x2F, 147 | 0xEB,0xEA,0xEA,0x6A,0x5A,0xD7,0x8D,0xFA,0x5C,0x75,0x75,0x1C,0xF0,0xBA,0x0A,0x22,0x94,0xF8,0x75,0x12,0xC5,0x41,0x51,0x4F,0x23,0x88,0xD3,0x75,0xC7,0x81,0x79,0x2C,0x30, 148 | 0x01,0x68,0xC0,0x30,0x08,0x63,0x94,0xBF,0x73,0xD0,0xC1,0x55,0x83,0x5C,0x84,0xC2,0xEB,0x73,0x6F,0x14,0x91,0x1B,0x43,0x34,0xF9,0x44,0xBB,0x5E,0xC3,0x8D,0x32,0x85,0x30, 149 | 0x17,0xE5,0x95,0xF6,0xB5,0xEE,0x9A,0x84,0x8A,0x2B,0x0E,0x8F,0x16,0xFE,0xFD,0x62,0x43,0xEF,0x68,0x16,0x5D,0xF5,0x34,0x19,0xCF,0x01,0xA3,0x47,0xBF,0x99,0xEB,0xDD,0x30, 150 | 0x2D,0x62,0x6B,0xBC,0x63,0x7A,0xA1,0x49,0xA1,0x86,0x5A,0xC8,0xA9,0x9F,0x77,0x03,0x9B,0x6A,0x62,0x18,0x29,0xCF,0x26,0xFE,0xA4,0xBE,0x8A,0x30,0xBB,0xA5,0xA4,0x36,0x31, 151 | 0x43,0xDF,0x40,0x82,0x11,0x06,0xA8,0x0E,0xB8,0xE1,0xA6,0x01,0x3D,0x41,0xF1,0xA3,0xF2,0xE5,0x5B,0x1A,0xF5,0xA8,0x18,0xE3,0x7A,0x7B,0x72,0x19,0xB7,0xB1,0x5D,0x8F,0x31, 152 | 0x59,0x5C,0x16,0x48,0xBF,0x91,0xAE,0xD3,0xCE,0x3C,0xF3,0x3A,0xD0,0xE2,0x6A,0x44,0x4A,0x61,0x55,0x1C,0xC1,0x82,0x0A,0xC8,0x50,0x38,0x5A,0x02,0xB3,0xBD,0x16,0xE8,0x31, 153 | 0x6F,0xD9,0xEB,0x0D,0x6D,0x1D,0xB5,0x98,0xE5,0x97,0x3F,0x74,0x63,0x84,0xE4,0xE4,0xA1,0xDC,0x4E,0x1E,0x8D,0x5C,0xFC,0xAC,0x26,0xF5,0x41,0xEB,0xAE,0xC9,0xCF,0x40,0x32, 154 | 0x85,0x56,0xC1,0xD3,0x1A,0xA9,0xBB,0x5D,0xFC,0xF2,0x8B,0xAD,0xF6,0x25,0x5E,0x85,0xF9,0x57,0x48,0x20,0x59,0x36,0xEE,0x91,0xFC,0xB1,0x29,0xD4,0xAA,0xD5,0x88,0x99,0x32, 155 | 0x9B,0xD3,0x96,0x99,0xC8,0x34,0xC2,0x22,0x13,0x4E,0xD8,0xE6,0x89,0xC7,0xD7,0x25,0x51,0xD3,0x41,0x22,0x25,0x10,0xE0,0x76,0xD2,0x6E,0x11,0xBD,0xA6,0xE1,0x41,0xF2,0x32, 156 | 0xB0,0x50,0x6C,0x5F,0x76,0xC0,0xC8,0xE7,0x29,0xA9,0x24,0x20,0x1D,0x69,0x51,0xC6,0xA8,0x4E,0x3B,0x24,0xF1,0xE9,0xD1,0x5B,0xA8,0x2B,0xF9,0xA5,0xA2,0xED,0xFA,0x4A,0x33, 157 | 0xC6,0xCD,0x41,0x25,0x24,0x4C,0xCF,0xAC,0x40,0x04,0x71,0x59,0xB0,0x0A,0xCB,0x66,0x00,0xCA,0x34,0x26,0xBD,0xC3,0xC3,0x40,0x7E,0xE8,0xE0,0x8E,0x9E,0xF9,0xB3,0xA3,0x33, 158 | 0xDC,0x4A,0x17,0xEB,0xD1,0xD7,0xD5,0x71,0x57,0x5F,0xBD,0x92,0x43,0xAC,0x44,0x07,0x58,0x45,0x2E,0x28,0x89,0x9D,0xB5,0x25,0x54,0xA5,0xC8,0x77,0x9A,0x05,0x6D,0xFC,0x33, 159 | 0xF2,0xC7,0xEC,0xB0,0x7F,0x63,0xDC,0x36,0x6E,0xBA,0x09,0xCC,0xD6,0x4D,0xBE,0xA7,0xAF,0xC0,0x27,0x2A,0x55,0x77,0xA7,0x0A,0x2A,0x62,0xB0,0x60,0x96,0x11,0x26,0x55,0x34, 160 | 0x08,0x45,0xC2,0x76,0x2D,0xEF,0xE2,0xFB,0x84,0x15,0x56,0x05,0x6A,0xEF,0x37,0x48,0x07,0x3C,0x21,0x2C,0x21,0x51,0x99,0xEF,0xFF,0x1E,0x98,0x49,0x92,0x1D,0xDF,0xAD,0x34, 161 | 0x1E,0xC2,0x97,0x3C,0xDB,0x7A,0xE9,0xC0,0x9B,0x70,0xA2,0x3E,0xFD,0x90,0xB1,0xE8,0x5E,0xB7,0x1A,0x2E,0xED,0x2A,0x8B,0xD4,0xD5,0xDB,0x7F,0x32,0x8E,0x29,0x98,0x06,0x35, 162 | 0x34,0x3F,0x6D,0x02,0x89,0x06,0xF0,0x85,0xB2,0xCB,0xEE,0x77,0x90,0x32,0x2B,0x89,0xB6,0x32,0x14,0x30,0xB9,0x04,0x7D,0xB9,0xAB,0x98,0x67,0x1B,0x8A,0x35,0x51,0x5F,0x35, 163 | 0x4A,0xBC,0x42,0xC8,0x36,0x92,0xF6,0x4A,0xC9,0x26,0x3B,0xB1,0x23,0xD4,0xA4,0x29,0x0E,0xAE,0x0D,0x32,0x85,0xDE,0x6E,0x9E,0x81,0x55,0x4F,0x04,0x86,0x41,0x0A,0xB8,0x35, 164 | 0x60,0x39,0x18,0x8E,0xE4,0x1D,0xFD,0x0F,0xE0,0x81,0x87,0xEA,0xB6,0x75,0x1E,0xCA,0x65,0x29,0x07,0x34,0x51,0xB8,0x60,0x83,0x57,0x12,0x37,0xED,0x81,0x4D,0xC3,0x10,0x36, 165 | 0x76,0xB6,0xED,0x53,0x92,0xA9,0x03,0xD5,0xF6,0xDC,0xD3,0x23,0x4A,0x17,0x98,0x6A,0xBD,0xA4,0x00,0x36,0x1D,0x92,0x52,0x68,0x2D,0xCF,0x1E,0xD6,0x7D,0x59,0x7C,0x69,0x36, 166 | 0x8C,0x33,0xC3,0x19,0x40,0x35,0x0A,0x9A,0x0D,0x38,0x20,0x5D,0xDD,0xB8,0x11,0x0B,0x15,0x20,0xFA,0x37,0xE9,0x6B,0x44,0x4D,0x03,0x8C,0x06,0xBF,0x79,0x65,0x35,0xC2,0x36, 167 | 0xA2,0xB0,0x98,0xDF,0xED,0xC0,0x10,0x5F,0x24,0x93,0x6C,0x96,0x70,0x5A,0x8B,0xAB,0x6C,0x9B,0xF3,0x39,0xB5,0x45,0x36,0x32,0xD9,0x48,0xEE,0xA7,0x75,0x71,0xEE,0x1A,0x37, 168 | 0xB8,0x2D,0x6E,0xA5,0x9B,0x4C,0x17,0x24,0x3B,0xEE,0xB8,0xCF,0x03,0xFC,0x04,0x4C,0xC4,0x16,0xED,0x3B,0x81,0x1F,0x28,0x17,0xAF,0x05,0xD6,0x90,0x71,0x7D,0xA7,0x73,0x37, 169 | 0xCE,0xAA,0x43,0x6B,0x49,0xD8,0x1D,0xE9,0x51,0x49,0x05,0x09,0x97,0x9D,0x7E,0xEC,0x1B,0x92,0xE6,0x3D,0x4D,0xF9,0x19,0xFC,0x84,0xC2,0xBD,0x79,0x6D,0x89,0x60,0xCC,0x37, 170 | 0xE4,0x27,0x19,0x31,0xF7,0x63,0x24,0xAE,0x68,0xA4,0x51,0x42,0x2A,0x3F,0xF8,0x8C,0x73,0x0D,0xE0,0x3F,0x19,0xD3,0x0B,0xE1,0x5A,0x7F,0xA5,0x62,0x69,0x95,0x19,0x25,0x38, 171 | 0xFA,0xA4,0xEE,0xF6,0xA4,0xEF,0x2A,0x73,0x7F,0xFF,0x9D,0x7B,0xBD,0xE0,0x71,0x2D,0xCB,0x88,0xD9,0x41,0xE5,0xAC,0xFD,0xC5,0x30,0x3C,0x8D,0x4B,0x65,0xA1,0xD2,0x7D,0x38, 172 | 0x10,0x22,0xC4,0xBC,0x52,0x7B,0x31,0x38,0x96,0x5A,0xEA,0xB4,0x50,0x82,0xEB,0xCD,0x22,0x04,0xD3,0x43,0xB1,0x86,0xEF,0xAA,0x06,0xF9,0x74,0x34,0x61,0xAD,0x8B,0xD6,0x38, 173 | 0x26,0x9F,0x99,0x82,0x00,0x07,0x38,0xFD,0xAC,0xB5,0x36,0xEE,0xE3,0x23,0x65,0x6E,0x7A,0x7F,0xCC,0x45,0x7D,0x60,0xE1,0x8F,0xDC,0xB5,0x5C,0x1D,0x5D,0xB9,0x44,0x2F,0x39, 174 | 0x3C,0x1C,0x6F,0x48,0xAE,0x92,0x3E,0xC2,0xC3,0x10,0x83,0x27,0x77,0xC5,0xDE,0x0E,0xD2,0xFA,0xC5,0x47,0x49,0x3A,0xD3,0x74,0xB2,0x72,0x44,0x06,0x59,0xC5,0xFD,0x87,0x39, 175 | 0x52,0x99,0x44,0x0E,0x5C,0x1E,0x45,0x87,0xDA,0x6B,0xCF,0x60,0x0A,0x67,0x58,0xAF,0x29,0x76,0xBF,0x49,0x15,0x14,0xC5,0x59,0x88,0x2F,0x2C,0xEF,0x54,0xD1,0xB6,0xE0,0x39, 176 | 0x68,0x16,0x1A,0xD4,0x09,0xAA,0x4B,0x4C,0xF1,0xC6,0x1B,0x9A,0x9D,0x08,0xD2,0x4F,0x81,0xF1,0xB8,0x4B,0xE1,0xED,0xB6,0x3E,0x5E,0xEC,0x13,0xD8,0x50,0xDD,0x6F,0x39,0x3A, 177 | 0x7D,0x93,0xEF,0x99,0xB7,0x35,0x52,0x11,0x08,0x22,0x68,0xD3,0x30,0xAA,0x4B,0xF0,0xD8,0x6C,0xB2,0x4D,0xAD,0xC7,0xA8,0x23,0x34,0xA9,0xFB,0xC0,0x4C,0xE9,0x28,0x92,0x3A, 178 | 0x93,0x10,0xC5,0x5F,0x65,0xC1,0x58,0xD6,0x1E,0x7D,0xB4,0x0C,0xC4,0x4B,0xC5,0x90,0x30,0xE8,0xAB,0x4F,0x79,0xA1,0x9A,0x08,0x0A,0x66,0xE3,0xA9,0x48,0xF5,0xE1,0xEA,0x3A, 179 | 0xA9,0x8D,0x9A,0x25,0x13,0x4D,0x5F,0x9B,0x35,0xD8,0x00,0x46,0x57,0xED,0x3E,0x31,0x88,0x63,0xA5,0x51,0x45,0x7B,0x8C,0xED,0xDF,0x22,0xCB,0x92,0x44,0x01,0x9B,0x43,0x3B, 180 | 0xBF,0x0A,0x70,0xEB,0xC0,0xD8,0x65,0x60,0x4C,0x33,0x4D,0x7F,0xEA,0x8E,0xB8,0xD1,0xDF,0xDE,0x9E,0x53,0x11,0x55,0x7E,0xD2,0xB5,0xDF,0xB2,0x7B,0x40,0x0D,0x54,0x9C,0x3B, 181 | 0xD5,0x87,0x45,0xB1,0x6E,0x64,0x6C,0x25,0x63,0x8E,0x99,0xB8,0x7D,0x30,0x32,0x72,0x37,0x5A,0x98,0x55,0xDD,0x2E,0x70,0xB7,0x8B,0x9C,0x9A,0x64,0x3C,0x19,0x0D,0xF5,0x3B, 182 | 0xEB,0x04,0x1B,0x77,0x1C,0xF0,0x72,0xEA,0x79,0xE9,0xE5,0xF1,0x10,0xD2,0xAB,0x12,0x8F,0xD5,0x91,0x57,0xA9,0x08,0x62,0x9C,0x61,0x59,0x82,0x4D,0x38,0x25,0xC6,0x4D,0x3C, 183 | 0x01,0x82,0xF0,0x3C,0xCA,0x7B,0x79,0xAF,0x90,0x44,0x32,0x2B,0xA4,0x73,0x25,0xB3,0xE6,0x50,0x8B,0x59,0x75,0xE2,0x53,0x81,0x37,0x16,0x6A,0x36,0x34,0x31,0x7F,0xA6,0x3C, 184 | 0x17,0xFF,0xC5,0x02,0x78,0x07,0x80,0x74,0xA7,0x9F,0x7E,0x64,0x37,0x15,0x9F,0x53,0x3E,0xCC,0x84,0x5B,0x41,0xBC,0x45,0x66,0x0D,0xD3,0x51,0x1F,0x30,0x3D,0x38,0xFF,0x3C, 185 | 0x2D,0x7C,0x9B,0xC8,0x25,0x93,0x86,0x39,0xBE,0xFA,0xCA,0x9D,0xCA,0xB6,0x18,0xF4,0x95,0x47,0x7E,0x5D,0x0D,0x96,0x37,0x4B,0xE3,0x8F,0x39,0x08,0x2C,0x49,0xF1,0x57,0x3D, 186 | 0x43,0xF9,0x70,0x8E,0xD3,0x1E,0x8D,0xFE,0xD4,0x55,0x17,0xD7,0x5D,0x58,0x92,0x94,0xED,0xC2,0x77,0x5F,0xD9,0x6F,0x29,0x30,0xB9,0x4C,0x21,0xF1,0x27,0x55,0xAA,0xB0,0x3D, 187 | 0x59,0x76,0x46,0x54,0x81,0xAA,0x93,0xC3,0xEB,0xB0,0x63,0x10,0xF1,0xF9,0x0B,0x35,0x45,0x3E,0x71,0x61,0xA5,0x49,0x1B,0x15,0x8F,0x09,0x09,0xDA,0x23,0x61,0x63,0x09,0x3E, 188 | 0x6F,0xF3,0x1B,0x1A,0x2F,0x36,0x9A,0x88,0x02,0x0C,0xB0,0x49,0x84,0x9B,0x85,0xD5,0x9C,0xB9,0x6A,0x63,0x71,0x23,0x0D,0xFA,0x64,0xC6,0xF0,0xC2,0x1F,0x6D,0x1C,0x62,0x3E, 189 | 0x85,0x70,0xF1,0xDF,0xDC,0xC1,0xA0,0x4D,0x19,0x67,0xFC,0x82,0x17,0x3D,0xFF,0x75,0xF4,0x34,0x64,0x65,0x3D,0xFD,0xFE,0xDE,0x3A,0x83,0xD8,0xAB,0x1B,0x79,0xD5,0xBA,0x3E, 190 | 0x9B,0xED,0xC6,0xA5,0x8A,0x4D,0xA7,0x12,0x30,0xC2,0x48,0xBC,0xAA,0xDE,0x78,0x16,0x4C,0xB0,0x5D,0x67,0x09,0xD7,0xF0,0xC3,0x10,0x40,0xC0,0x94,0x17,0x85,0x8E,0x13,0x3F, 191 | 0xB1,0x6A,0x9C,0x6B,0x38,0xD9,0xAD,0xD7,0x46,0x1D,0x95,0xF5,0x3D,0x80,0xF2,0xB6,0xA3,0x2B,0x57,0x69,0xD5,0xB0,0xE2,0xA8,0xE6,0xFC,0xA7,0x7D,0x13,0x91,0x47,0x6C,0x3F, 192 | 0xC7,0xE7,0x71,0x31,0xE6,0x64,0xB4,0x9C,0x5D,0x78,0xE1,0x2E,0xD1,0x21,0x6C,0x57,0xFB,0xA6,0x50,0x6B,0xA1,0x8A,0xD4,0x8D,0xBC,0xB9,0x8F,0x66,0x0F,0x9D,0x00,0xC5,0x3F, 193 | 0xDD,0x64,0x47,0xF7,0x93,0xF0,0xBA,0x61,0x74,0xD3,0x2D,0x68,0x64,0xC3,0xE5,0xF7,0x52,0x22,0x4A,0x6D,0x6D,0x64,0xC6,0x72,0x92,0x76,0x77,0x4F,0x0B,0xA9,0xB9,0x1D,0x40, 194 | 0xF3,0xE1,0x1C,0xBD,0x41,0x7C,0xC1,0x26,0x8B,0x2E,0x7A,0xA1,0xF7,0x64,0x5F,0x98,0xAA,0x9D,0x43,0x6F,0x39,0x3E,0xB8,0x57,0x68,0x33,0x5F,0x38,0x07,0xB5,0x72,0x76,0x40, 195 | 0x09,0x5F,0xF2,0x82,0xEF,0x07,0xC8,0xEB,0xA1,0x89,0xC6,0xDA,0x8A,0x06,0xD9,0x38,0x02,0x19,0x3D,0x71,0x05,0x18,0xAA,0x3C,0x3E,0xF0,0x46,0x21,0x03,0xC1,0x2B,0xCF,0x40, 196 | 0x1F,0xDC,0xC7,0x48,0x9D,0x93,0xCE,0xB0,0xB8,0xE4,0x12,0x14,0x1E,0xA8,0x52,0xD9,0x59,0x94,0x36,0x73,0xD1,0xF1,0x9B,0x21,0x14,0xAD,0x2E,0x0A,0xFF,0xCC,0xE4,0x27,0x41, 197 | 0x35,0x59,0x9D,0x0E,0x4B,0x1F,0xD5,0x75,0xCF,0x3F,0x5F,0x4D,0xB1,0x49,0xCC,0x79,0xB1,0x0F,0x30,0x75,0x9D,0xCB,0x8D,0x06,0xEA,0x69,0x16,0xF3,0xFA,0xD8,0x9D,0x80,0x41, 198 | 0x4A,0xD6,0x72,0xD4,0xF8,0xAA,0xDB,0x3A,0xE6,0x9A,0xAB,0x86,0x44,0xEB,0x45,0x1A,0x09,0x8B,0x29,0x77,0x69,0xA5,0x7F,0xEB,0xBF,0x26,0xFE,0xDB,0xF6,0xE4,0x56,0xD9,0x41, 199 | 0x60,0x53,0x48,0x9A,0xA6,0x36,0xE2,0xFF,0xFC,0xF5,0xF7,0xBF,0xD7,0x8C,0xBF,0xBA,0x60,0x06,0x23,0x79,0x35,0x7F,0x71,0xD0,0x95,0xE3,0xE5,0xC4,0xF2,0xF0,0x0F,0x32,0x42, 200 | 0x76,0xD0,0x1D,0x60,0x54,0xC2,0xE8,0xC4,0x13,0x51,0x44,0xF9,0x6A,0x2E,0x39,0x5B,0xB8,0x81,0x1C,0x7B,0x01,0x59,0x63,0xB5,0x6B,0xA0,0xCD,0xAD,0xEE,0xFC,0xC8,0x8A,0x42, 201 | 0x8C,0x4D,0xF3,0x25,0x02,0x4E,0xEF,0x89,0x2A,0xAC,0x90,0x32,0xFE,0xCF,0xB2,0xFB,0x0F,0xFD,0x15,0x7D,0xCD,0x32,0x55,0x9A,0x41,0x5D,0xB5,0x96,0xEA,0x08,0x82,0xE3,0x42, 202 | 0xA2,0xCA,0xC8,0xEB,0xAF,0xD9,0xF5,0x4E,0x41,0x07,0xDD,0x6B,0x91,0x71,0x2C,0x9C,0x67,0x78,0x0F,0x7F,0x99,0x0C,0x47,0x7F,0x17,0x1A,0x9D,0x7F,0xE6,0x14,0x3B,0x3C,0x43, 203 | 0xB8,0x47,0x9E,0xB1,0x5D,0x65,0xFC,0x13,0x58,0x62,0x29,0xA5,0x24,0x13,0xA6,0x3C,0xBF,0xF3,0x08,0x81,0x65,0xE6,0x38,0x64,0xED,0xD6,0x84,0x68,0xE2,0x20,0xF4,0x94,0x43, 204 | 0xCE,0xC4,0x73,0x77,0x0B,0xF1,0x02,0xD9,0x6E,0xBD,0x75,0xDE,0xB7,0xB4,0x1F,0xDD,0x16,0x6F,0x02,0x83,0x31,0xC0,0x2A,0x49,0xC3,0x93,0x6C,0x51,0xDE,0x2C,0xAD,0xED,0x43, 205 | 0xE4,0x41,0x49,0x3D,0xB9,0x7C,0x09,0x9E,0x85,0x18,0xC2,0x17,0x4B,0x56,0x99,0x7D,0x6E,0xEA,0xFB,0x84,0xFD,0x99,0x1C,0x2E,0x99,0x50,0x54,0x3A,0xDA,0x38,0x66,0x46,0x44, 206 | 0xFA,0xBE,0x1E,0x03,0x67,0x08,0x10,0x63,0x9C,0x73,0x0E,0x51,0xDE,0xF7,0x12,0x1E,0xC6,0x65,0xF5,0x86,0xC9,0x73,0x0E,0x13,0x6F,0x0D,0x3C,0x23,0xD6,0x44,0x1F,0x9F,0x44, 207 | 0x10,0x3C,0xF4,0xC8,0x14,0x94,0x16,0x28,0xB3,0xCE,0x5A,0x8A,0x71,0x99,0x8C,0xBE,0x1D,0xE1,0xEE,0x88,0x95,0x4D,0x00,0xF8,0x44,0xCA,0x23,0x0C,0xD2,0x50,0xD8,0xF7,0x44, 208 | 0x26,0xB9,0xC9,0x8E,0xC2,0x1F,0x1D,0xED,0xC9,0x29,0xA7,0xC3,0x04,0x3B,0x06,0x5F,0x75,0x5C,0xE8,0x8A,0x61,0x27,0xF2,0xDC,0x1A,0x87,0x0B,0xF5,0xCD,0x5C,0x91,0x50,0x45, 209 | 0x3C,0x36,0x9F,0x54,0x70,0xAB,0x23,0xB2,0xE0,0x84,0xF3,0xFC,0x97,0xDC,0x7F,0xFF,0xCC,0xD7,0xE1,0x8C,0x2D,0x01,0xE4,0xC1,0xF0,0x43,0xF3,0xDD,0xC9,0x68,0x4A,0xA9,0x45, 210 | 0x52,0xB3,0x74,0x1A,0x1E,0x37,0x2A,0x77,0xF7,0xDF,0x3F,0x36,0x2B,0x7E,0xF9,0x9F,0x24,0x53,0xDB,0x8E,0xF9,0xDA,0xD5,0xA6,0xC6,0x00,0xDB,0xC6,0xC5,0x74,0x03,0x02,0x46, 211 | 0x68,0x30,0x4A,0xE0,0xCB,0xC2,0x30,0x3C,0x0E,0x3B,0x8C,0x6F,0xBE,0x1F,0x73,0x40,0x7C,0xCE,0xD4,0x90,0xC5,0xB4,0xC7,0x8B,0x9C,0xBD,0xC2,0xAF,0xC1,0x80,0xBC,0x5A,0x46, 212 | 0x7E,0xAD,0x1F,0xA6,0x79,0x4E,0x37,0x01,0x25,0x96,0xD8,0xA8,0x51,0xC1,0xEC,0xE0,0xD3,0x49,0xCE,0x92,0x91,0x8E,0xB9,0x70,0x72,0x7A,0xAA,0x98,0xBD,0x8C,0x75,0xB3,0x46, 213 | 0x94,0x2A,0xF5,0x6B,0x27,0xDA,0x3D,0xC6,0x3B,0xF1,0x24,0xE2,0xE4,0x62,0x66,0x81,0x2B,0xC5,0xC7,0x94,0x5D,0x68,0xAB,0x55,0x48,0x37,0x92,0x81,0xB9,0x98,0x2E,0x0C,0x47, 214 | 0xAA,0xA7,0xCA,0x31,0xD5,0x65,0x44,0x8B,0x52,0x4C,0x71,0x1B,0x78,0x04,0xE0,0x21,0x83,0x40,0xC1,0x96,0x29,0x42,0x9D,0x3A,0x1E,0xF4,0x79,0x6A,0xB5,0xA4,0xE7,0x64,0x47, 215 | 0xC0,0x24,0xA0,0xF7,0x82,0xF1,0x4A,0x50,0x69,0xA7,0xBD,0x54,0x0B,0xA6,0x59,0xC2,0xDA,0xBB,0xBA,0x98,0xF5,0x1B,0x8F,0x1F,0xF4,0xB0,0x61,0x53,0xB1,0xB0,0xA0,0xBD,0x47, 216 | 0xD6,0xA1,0x75,0xBD,0x30,0x7D,0x51,0x15,0x80,0x02,0x0A,0x8E,0x9E,0x47,0xD3,0x62,0x32,0x37,0xB4,0x9A,0xC1,0xF5,0x80,0x04,0xCA,0x6D,0x49,0x3C,0xAD,0xBC,0x59,0x16,0x48, 217 | 0xEC,0x1E,0x4B,0x83,0xDE,0x08,0x58,0xDA,0x96,0x5D,0x56,0xC7,0x31,0xE9,0x4C,0x03,0x8A,0xB2,0xAD,0x9C,0x8D,0xCF,0x72,0xE9,0x9F,0x2A,0x31,0x25,0xA9,0xC8,0x12,0x6F,0x48, 218 | 0x02,0x9C,0x20,0x49,0x8C,0x94,0x5E,0x9F,0xAD,0xB8,0xA2,0x00,0xC5,0x8A,0xC6,0xA3,0xE1,0x2D,0xA7,0x9E,0x59,0xA9,0x64,0xCE,0x75,0xE7,0x18,0x0E,0xA5,0xD4,0xCB,0xC7,0x48, 219 | 0x17,0x19,0xF6,0x0E,0x3A,0x20,0x65,0x64,0xC4,0x13,0xEF,0x39,0x58,0x2C,0x40,0x44,0x39,0xA9,0xA0,0xA0,0x25,0x83,0x56,0xB3,0x4B,0xA4,0x00,0xF7,0xA0,0xE0,0x84,0x20,0x49, 220 | 0x2D,0x96,0xCB,0xD4,0xE7,0xAB,0x6B,0x29,0xDB,0x6E,0x3B,0x73,0xEB,0xCD,0xB9,0xE4,0x90,0x24,0x9A,0xA2,0xF1,0x5C,0x48,0x98,0x21,0x61,0xE8,0xDF,0x9C,0xEC,0x3D,0x79,0x49, 221 | 0x43,0x13,0xA1,0x9A,0x95,0x37,0x72,0xEE,0xF1,0xC9,0x87,0xAC,0x7E,0x6F,0x33,0x85,0xE8,0x9F,0x93,0xA4,0xBD,0x36,0x3A,0x7D,0xF7,0x1D,0xD0,0xC8,0x98,0xF8,0xF6,0xD1,0x49, 222 | 0x59,0x90,0x76,0x60,0x43,0xC3,0x78,0xB3,0x08,0x25,0xD4,0xE5,0x11,0x11,0xAD,0x25,0x40,0x1B,0x8D,0xA6,0x89,0x10,0x2C,0x62,0xCD,0xDA,0xB7,0xB1,0x94,0x04,0xB0,0x2A,0x4A, 223 | 0x6F,0x0D,0x4C,0x26,0xF1,0x4E,0x7F,0x78,0x1F,0x80,0x20,0x1F,0xA5,0xB2,0x26,0xC6,0x97,0x96,0x86,0xA8,0x55,0xEA,0x1D,0x47,0xA3,0x97,0x9F,0x9A,0x90,0x10,0x69,0x83,0x4A, 224 | 0x85,0x8A,0x21,0xEC,0x9E,0xDA,0x85,0x3D,0x36,0xDB,0x6C,0x58,0x38,0x54,0xA0,0x66,0xEF,0x11,0x80,0xAA,0x21,0xC4,0x0F,0x2C,0x79,0x54,0x87,0x83,0x8C,0x1C,0x22,0xDC,0x4A, 225 | 0x9B,0x07,0xF7,0xB1,0x4C,0x66,0x8C,0x02,0x4D,0x36,0xB9,0x91,0xCB,0xF5,0x19,0x07,0x47,0x8D,0x79,0xAC,0xED,0x9D,0x01,0x11,0x4F,0x11,0x6F,0x6C,0x88,0x28,0xDB,0x34,0x4B, 226 | 0xB1,0x84,0xCC,0x77,0xFA,0xF1,0x92,0xC7,0x63,0x91,0x05,0xCB,0x5E,0x97,0x93,0xA7,0x9E,0x08,0x73,0xAE,0xB9,0x77,0xF3,0xF5,0x24,0xCE,0x56,0x55,0x84,0x34,0x94,0x8D,0x4B, 227 | 0xC7,0x01,0xA2,0x3D,0xA8,0x7D,0x99,0x8C,0x7A,0xEC,0x51,0x04,0xF2,0x38,0x0D,0x48,0xF6,0x83,0x6C,0xB0,0x85,0x51,0xE5,0xDA,0xFA,0x8A,0x3E,0x3E,0x80,0x40,0x4D,0xE6,0x4B, 228 | 0xDD,0x7E,0x77,0x03,0x56,0x09,0xA0,0x51,0x91,0x47,0x9E,0x3D,0x85,0xDA,0x86,0xE8,0x4D,0xFF,0x65,0xB2,0x51,0x2B,0xD7,0xBF,0xD0,0x47,0x26,0x27,0x7C,0x4C,0x06,0x3F,0x4C, 229 | 0xF3,0xFB,0x4C,0xC9,0x03,0x95,0xA6,0x16,0xA8,0xA2,0xEA,0x76,0x18,0x7C,0x00,0x89,0xA5,0x7A,0x5F,0xB4,0x1D,0x05,0xC9,0xA4,0xA6,0x04,0x0E,0x10,0x78,0x58,0xBF,0x97,0x4C, 230 | 0x09,0x79,0x22,0x8F,0xB1,0x20,0xAD,0xDB,0xBE,0xFD,0x36,0xB0,0xAB,0x1D,0x7A,0x29,0xFD,0xF5,0x58,0xB6,0xE9,0xDE,0xBA,0x89,0x7C,0xC1,0xF5,0xF8,0x73,0x64,0x78,0xF0,0x4C, 231 | 0x1F,0xF6,0xF7,0x54,0x5F,0xAC,0xB3,0xA0,0xD5,0x58,0x83,0xE9,0x3E,0xBF,0xF3,0xC9,0x54,0x71,0x52,0xB8,0xB5,0xB8,0xAC,0x6E,0x52,0x7E,0xDD,0xE1,0x6F,0x70,0x31,0x49,0x4D, 232 | 0x35,0x73,0xCD,0x1A,0x0D,0x38,0xBA,0x65,0xEC,0xB3,0xCF,0x22,0xD2,0x60,0x6D,0x6A,0xAC,0xEC,0x4B,0xBA,0x81,0x92,0x9E,0x53,0x28,0x3B,0xC5,0xCA,0x6B,0x7C,0xEA,0xA1,0x4D, 233 | 0x4B,0xF0,0xA2,0xE0,0xBA,0xC3,0xC0,0x2A,0x03,0x0F,0x1C,0x5C,0x65,0x02,0xE7,0x0A,0x04,0x68,0x45,0xBC,0x4D,0x6C,0x90,0x38,0xFE,0xF7,0xAC,0xB3,0x67,0x88,0xA3,0xFA,0x4D, 234 | 0x61,0x6D,0x78,0xA6,0x68,0x4F,0xC7,0xEF,0x19,0x6A,0x68,0x95,0xF8,0xA3,0x60,0xAB,0x5B,0xE3,0x3E,0xBE,0x19,0x46,0x82,0x1D,0xD4,0xB4,0x94,0x9C,0x63,0x94,0x5C,0x53,0x4E, 235 | 0x77,0xEA,0x4D,0x6C,0x16,0xDB,0xCD,0xB4,0x30,0xC5,0xB4,0xCE,0x8B,0x45,0xDA,0x4B,0xB3,0x5E,0x38,0xC0,0xE5,0x1F,0x74,0x02,0xAA,0x71,0x7C,0x85,0x5F,0xA0,0x15,0xAC,0x4E, 236 | 0x8D,0x67,0x23,0x32,0xC4,0x66,0xD4,0x79,0x47,0x20,0x01,0x08,0x1F,0xE7,0x53,0xEC,0x0A,0xDA,0x31,0xC2,0xB1,0xF9,0x65,0xE7,0x7F,0x2E,0x64,0x6E,0x5B,0xAC,0xCE,0x04,0x4F, 237 | 0xA3,0xE4,0xF8,0xF7,0x71,0xF2,0xDA,0x3E,0x5E,0x7B,0x4D,0x41,0xB2,0x88,0xCD,0x8C,0x62,0x55,0x2B,0xC4,0x7D,0xD3,0x57,0xCC,0x55,0xEB,0x4B,0x57,0x57,0xB8,0x87,0x5D,0x4F, 238 | 0xB9,0x61,0xCE,0xBD,0x1F,0x7E,0xE1,0x03,0x75,0xD6,0x99,0x7A,0x45,0x2A,0x47,0x2D,0xBA,0xD0,0x24,0xC6,0x49,0xAD,0x49,0xB1,0x2B,0xA8,0x33,0x40,0x53,0xC4,0x40,0xB6,0x4F, 239 | 0xCF,0xDE,0xA3,0x83,0xCD,0x09,0xE8,0xC8,0x8B,0x31,0xE6,0xB3,0xD8,0xCB,0xC0,0xCD,0x11,0x4C,0x1E,0xC8,0x15,0x87,0x3B,0x96,0x01,0x65,0x1B,0x29,0x4F,0xD0,0xF9,0x0E,0x50, 240 | 0xE4,0x5B,0x79,0x49,0x7B,0x95,0xEE,0x8D,0xA2,0x8C,0x32,0xED,0x6B,0x6D,0x3A,0x6E,0x69,0xC7,0x17,0xCA,0xE1,0x60,0x2D,0x7B,0xD7,0x21,0x03,0x12,0x4B,0xDC,0xB2,0x67,0x50, 241 | 0xFA,0xD8,0x4E,0x0F,0x29,0x21,0xF5,0x52,0xB9,0xE7,0x7E,0x26,0xFF,0x0E,0xB4,0x0E,0xC1,0x42,0x11,0xCC,0xAD,0x3A,0x1F,0x60,0xAD,0xDE,0xEA,0xFA,0x46,0xE8,0x6B,0xC0,0x50, 242 | 0x10,0x56,0x24,0xD5,0xD6,0xAC,0xFB,0x17,0xD0,0x42,0xCB,0x5F,0x92,0xB0,0x2D,0xAF,0x18,0xBE,0x0A,0xCE,0x79,0x14,0x11,0x45,0x83,0x9B,0xD2,0xE3,0x42,0xF4,0x24,0x19,0x51, 243 | 0x26,0xD3,0xF9,0x9A,0x84,0x38,0x02,0xDD,0xE6,0x9D,0x17,0x99,0x25,0x52,0xA7,0x4F,0x70,0x39,0x04,0xD0,0x45,0xEE,0x02,0x2A,0x59,0x58,0xBA,0xCC,0x3E,0x00,0xDE,0x71,0x51, 244 | 0x3C,0x50,0xCF,0x60,0x32,0xC4,0x08,0xA2,0xFD,0xF8,0x63,0xD2,0xB8,0xF3,0x20,0xF0,0xC7,0xB4,0xFD,0xD1,0x11,0xC8,0xF4,0x0E,0x2F,0x15,0xA2,0xB5,0x3A,0x0C,0x97,0xCA,0x51, 245 | 0x52,0xCD,0xA4,0x26,0xE0,0x4F,0x0F,0x67,0x14,0x54,0xB0,0x0B,0x4C,0x95,0x9A,0x90,0x1F,0x30,0xF7,0xD3,0xDD,0xA1,0xE6,0xF3,0x04,0xD2,0x89,0x9E,0x36,0x18,0x50,0x23,0x52, 246 | 0x68,0x4A,0x7A,0xEC,0x8D,0xDB,0x15,0x2C,0x2B,0xAF,0xFC,0x44,0xDF,0x36,0x14,0x31,0x77,0xAB,0xF0,0xD5,0xA9,0x7B,0xD8,0xD8,0xDA,0x8E,0x71,0x87,0x32,0x24,0x09,0x7C,0x52, 247 | 0x7E,0xC7,0x4F,0xB2,0x3B,0x67,0x1C,0xF1,0x41,0x0A,0x49,0x7E,0x72,0xD8,0x8D,0xD1,0xCE,0x26,0xEA,0xD7,0x75,0x55,0xCA,0xBD,0xB0,0x4B,0x59,0x70,0x2E,0x30,0xC2,0xD4,0x52, 248 | 0x94,0x44,0x25,0x78,0xE9,0xF2,0x22,0xB6,0x58,0x65,0x95,0xB7,0x05,0x7A,0x07,0x72,0x26,0xA2,0xE3,0xD9,0x41,0x2F,0xBC,0xA2,0x86,0x08,0x41,0x59,0x2A,0x3C,0x7B,0x2D,0x53, 249 | 0xAA,0xC1,0xFA,0x3D,0x97,0x7E,0x29,0x7B,0x6F,0xC0,0xE1,0xF0,0x98,0x1B,0x81,0x12,0x7E,0x1D,0xDD,0xDB,0x0D,0x09,0xAE,0x87,0x5C,0xC5,0x28,0x42,0x26,0x48,0x34,0x86,0x53, 250 | 0xC0,0x3E,0xD0,0x03,0x45,0x0A,0x30,0x40,0x86,0x1B,0x2E,0x2A,0x2C,0xBD,0xFA,0xB2,0xD5,0x98,0xD6,0xDD,0xD9,0xE2,0x9F,0x6C,0x32,0x82,0x10,0x2B,0x22,0x54,0xED,0xDE,0x53, 251 | 0xD6,0xBB,0xA5,0xC9,0xF2,0x95,0x36,0x05,0x9D,0x76,0x7A,0x63,0xBF,0x5E,0x74,0x53,0x2D,0x14,0xD0,0xDF,0xA5,0xBC,0x91,0x51,0x08,0x3F,0xF8,0x13,0x1E,0x60,0xA6,0x37,0x54, 252 | 0xEC,0x38,0x7B,0x8F,0xA0,0x21,0x3D,0xCA,0xB3,0xD1,0xC6,0x9C,0x52,0x00,0xEE,0xF3,0x84,0x8F,0xC9,0xE1,0x71,0x96,0x83,0x36,0xDE,0xFB,0xDF,0xFC,0x19,0x6C,0x5F,0x90,0x54, 253 | 0x02,0xB6,0x50,0x55,0x4E,0xAD,0x43,0x8F,0xCA,0x2C,0x13,0xD6,0xE5,0xA1,0x67,0x94,0xDC,0x0A,0xC3,0xE3,0x3D,0x70,0x75,0x1B,0xB4,0xB8,0xC7,0xE5,0x15,0x78,0x18,0xE9,0x54, 254 | 0x18,0x33,0x26,0x1B,0xFC,0x38,0x4A,0x54,0xE1,0x87,0x5F,0x0F,0x79,0x43,0xE1,0x34,0x34,0x86,0xBC,0xE5,0x09,0x4A,0x67,0x00,0x8A,0x75,0xAF,0xCE,0x11,0x84,0xD1,0x41,0x55, 255 | 0x2E,0xB0,0xFB,0xE0,0xA9,0xC4,0x50,0x19,0xF8,0xE2,0xAB,0x48,0x0C,0xE5,0x5A,0xD5,0x8B,0x01,0xB6,0xE7,0xD5,0x23,0x59,0xE5,0x5F,0x32,0x97,0xB7,0x0D,0x90,0x8A,0x9A,0x55, 256 | 0x44,0x2D,0xD1,0xA6,0x57,0x50,0x57,0xDE,0x0E,0x3E,0xF8,0x81,0x9F,0x86,0xD4,0x75,0xE3,0x7C,0xAF,0xE9,0xA1,0xFD,0x4A,0xCA,0x35,0xEF,0x7E,0xA0,0x09,0x9C,0x43,0xF3,0x55, 257 | 0x5A,0xAA,0xA6,0x6C,0x05,0xDC,0x5D,0xA3,0x25,0x99,0x44,0xBB,0x32,0x28,0x4E,0x16,0x3B,0xF8,0xA8,0xEB,0x6D,0xD7,0x3C,0xAF,0x0B,0xAC,0x66,0x89,0x05,0xA8,0xFC,0x4B,0x56, 258 | 0x70,0x27,0x7C,0x32,0xB3,0x67,0x64,0x68,0x3C,0xF4,0x90,0xF4,0xC5,0xC9,0xC7,0xB6,0x92,0x73,0xA2,0xED,0x39,0xB1,0x2E,0x94,0xE1,0x68,0x4E,0x72,0x01,0xB4,0xB5,0xA4,0x56, 259 | 0x86,0xA4,0x51,0xF8,0x60,0xF3,0x6A,0x2D,0x53,0x4F,0xDD,0x2D,0x59,0x6B,0x41,0x57,0xEA,0xEE,0x9B,0xEF,0x05,0x8B,0x20,0x79,0xB7,0x25,0x36,0x5B,0xFD,0xBF,0x6E,0xFD,0x56, 260 | 0x9C,0x21,0x27,0xBE,0x0E,0x7F,0x71,0xF2,0x69,0xAA,0x29,0x67,0xEC,0x0C,0xBB,0xF7,0x41,0x6A,0x95,0xF1,0xD1,0x64,0x12,0x5E,0x8D,0xE2,0x1D,0x44,0xF9,0xCB,0x27,0x56,0x57, 261 | 0xB2,0x9E,0xFC,0x83,0xBC,0x0A,0x78,0xB7,0x80,0x05,0x76,0xA0,0x7F,0xAE,0x34,0x98,0x99,0xE5,0x8E,0xF3,0x9D,0x3E,0x04,0x43,0x63,0x9F,0x05,0x2D,0xF5,0xD7,0xE0,0xAE,0x57, 262 | 0xC7,0x1B,0xD2,0x49,0x6A,0x96,0x7E,0x7C,0x97,0x60,0xC2,0xD9,0x12,0x50,0xAE,0x38,0xF1,0x60,0x88,0xF5,0x69,0x18,0xF6,0x27,0x39,0x5C,0xED,0x15,0xF1,0xE3,0x99,0x07,0x58, 263 | 0xDD,0x98,0xA7,0x0F,0x18,0x22,0x85,0x41,0xAE,0xBB,0x0E,0x13,0xA6,0xF1,0x27,0xD9,0x48,0xDC,0x81,0xF7,0x35,0xF2,0xE7,0x0C,0x0F,0x19,0xD5,0xFE,0xEC,0xEF,0x52,0x60,0x58 264 | }; 265 | 266 | char ofixed_ln_log_components[] = { 267 | 0x2B,0xFA,0xAA,0x8B,0x5B,0x17,0x0D,0x8A,0x2D,0xB6,0x98,0x72,0x26,0x43,0xF3,0x40,0xAF,0xF6,0xF2,0x03,0x98,0xB3,0xE3,0xC9,0xAB,0x79,0xCF,0xD1,0xF7,0x17,0x72,0xB1, 268 | 0x60,0x3B,0x9E,0xC5,0x8E,0xD7,0x8A,0xB3,0xC2,0xD7,0x47,0x45,0xB3,0xFF,0x20,0x7D,0x06,0x86,0x48,0x01,0xBD,0xD9,0x35,0xDA,0xCA,0x2F,0x61,0xFE,0xB2,0x8F,0xCC,0x67, 269 | 0x46,0xC7,0xBF,0x64,0xF5,0x33,0xF1,0x70,0xB1,0xC1,0xAD,0x11,0x74,0xEA,0x65,0xC7,0x95,0x44,0x73,0xFF,0xE5,0x3D,0xB0,0x4B,0x58,0x43,0x34,0x35,0x8F,0xEF,0x1F,0x39, 270 | 0x95,0x7C,0x91,0xFF,0xC1,0x97,0x08,0xDD,0x57,0xF9,0xF6,0x17,0x40,0xBC,0x4E,0xB9,0x5D,0x15,0x9E,0xFE,0xE1,0xFF,0x87,0xEA,0xE9,0xE5,0xF2,0x2A,0x6E,0x07,0x27,0x1E, 271 | 0x49,0x98,0xF6,0x96,0x0A,0x1F,0x85,0x71,0x96,0x25,0xB5,0x75,0x33,0x4D,0x47,0xD3,0x98,0x78,0x99,0x75,0xB7,0xB8,0x64,0xBE,0x30,0x53,0xB1,0x08,0x60,0x18,0x85,0x0F, 272 | 0xCD,0x3D,0x67,0xE3,0x8F,0x75,0x6C,0xDF,0xD1,0x5A,0xF3,0xDD,0x4C,0xE1,0xFA,0xAE,0xAE,0x9F,0x22,0xEF,0xF1,0x04,0x3F,0x3E,0x13,0xC0,0x0C,0x9E,0xC3,0xA6,0xE0,0x07, 273 | 0x83,0x2F,0x12,0x77,0x05,0xFE,0x40,0xD1,0x35,0x53,0xDC,0x3D,0x90,0xBE,0x03,0xEB,0xDB,0xAA,0x57,0x6F,0x9A,0x4E,0xDB,0xF3,0x79,0x7C,0x80,0x1F,0x16,0x15,0xF8,0x03, 274 | 0xC3,0x88,0x57,0x6B,0x88,0x27,0x70,0x76,0xA8,0x73,0xA0,0xF9,0x3E,0x2C,0xDB,0xB3,0xD2,0x82,0xC2,0x1D,0x39,0x90,0x76,0xC3,0x8F,0x78,0x06,0xB1,0xA6,0x02,0xFE,0x01, 275 | 0x22,0x33,0x1A,0x5A,0x33,0x6E,0xBA,0x91,0x24,0x58,0x72,0x6D,0xDD,0x29,0xCD,0x8C,0xB4,0x5B,0x6A,0xDA,0xB4,0x5A,0x43,0x50,0x02,0x5E,0x88,0x15,0x55,0x80,0xFF,0x00, 276 | 0xE8,0xE6,0xAC,0x12,0xCC,0x56,0x33,0xC7,0x1E,0x01,0x9A,0xE8,0x22,0xEC,0xD8,0xCA,0xB1,0x1A,0x3B,0x3E,0x15,0x3A,0x9E,0xE2,0x99,0x43,0xAC,0xA6,0x0A,0xE0,0x7F,0x00, 277 | 0x0C,0x72,0xEB,0xA6,0x64,0xC5,0x34,0x6E,0xB0,0x4E,0xEF,0x62,0x17,0xD6,0x30,0x8E,0x8E,0x26,0x99,0x24,0xA3,0xA0,0x09,0x78,0x1F,0x62,0x15,0x55,0x01,0xF8,0x3F,0x00, 278 | 0xAC,0xD7,0x09,0x5C,0x36,0x8A,0x58,0x4E,0x9E,0xFC,0xE0,0xE5,0xE9,0xB8,0x5E,0x54,0x38,0xCB,0x18,0xB3,0xD8,0x8A,0x67,0x06,0x11,0xAB,0xA6,0x2A,0x00,0xFE,0x1F,0x00, 279 | 0x5F,0xF2,0x22,0x82,0x19,0xE9,0xB2,0xC9,0x83,0xD0,0x02,0x80,0x0B,0xCD,0xC8,0x49,0x05,0xEE,0x71,0xE2,0x26,0xE0,0x5D,0x88,0x58,0x15,0x55,0x05,0x80,0xFF,0x0F,0x00, 280 | 0x60,0x68,0xB2,0xC4,0x95,0x8A,0xC0,0x46,0xBE,0x47,0x46,0xDE,0x94,0xD7,0x90,0x6A,0x0F,0xBF,0xC2,0x2B,0x9E,0x99,0x43,0xC4,0xAA,0xA6,0xAA,0x00,0xE0,0xFF,0x07,0x00, 281 | 0xDA,0xBB,0x28,0x32,0x0B,0x17,0xB8,0xF7,0x47,0x7C,0xA2,0x08,0x7A,0x43,0xCF,0x0D,0xC1,0xE9,0x9B,0x80,0x77,0x1F,0x22,0x56,0x15,0x55,0x15,0x00,0xF8,0xFF,0x03,0x00, 282 | 0x3B,0xE4,0x5A,0x8C,0xB1,0x09,0x2A,0x58,0xB8,0x4D,0xC2,0x82,0x20,0x6E,0xE8,0xF8,0x6A,0xAF,0x78,0x66,0x06,0x11,0xB1,0xAA,0xA6,0xAA,0x02,0x00,0xFE,0xFF,0x01,0x00, 283 | 0xC0,0xAF,0x76,0x18,0x66,0x4B,0x1E,0xAF,0x75,0x16,0xF3,0xAF,0x98,0x8C,0x02,0x07,0x70,0x02,0xDE,0x5D,0x88,0x88,0x55,0x15,0x55,0x55,0x00,0x80,0xFF,0xFF,0x00,0x00, 284 | 0x38,0x54,0x1B,0xD1,0x96,0xD7,0x9E,0x48,0x01,0xE6,0xBF,0x64,0xCC,0xE2,0x0B,0xBE,0xE2,0x99,0x99,0x43,0x44,0xAC,0xAA,0xA6,0xAA,0x0A,0x00,0xE0,0xFF,0x7F,0x00,0x00, 285 | 0xF1,0x12,0x12,0x5E,0x4F,0x05,0x3F,0x1F,0xEE,0x79,0xB8,0xC7,0x09,0x7C,0xC0,0x09,0x78,0x77,0x1F,0x22,0x62,0x55,0x15,0x55,0x55,0x01,0x00,0xF8,0xFF,0x3F,0x00,0x00, 286 | 0x35,0x4F,0xC2,0xBE,0x18,0x69,0xD7,0x75,0xC3,0x3D,0xFC,0x8A,0x8F,0xF8,0x8A,0x67,0x66,0x06,0x11,0x11,0xAB,0xAA,0xA6,0xAA,0x2A,0x00,0x00,0xFE,0xFF,0x1F,0x00,0x00, 287 | 0xCB,0xAB,0xFA,0x4E,0xAB,0x9D,0x5A,0x43,0x37,0x04,0x27,0x50,0x02,0x27,0xE0,0xDD,0x5D,0x88,0x88,0x58,0x55,0x15,0x55,0x55,0x05,0x00,0x80,0xFF,0xFF,0x0F,0x00,0x00, 288 | 0xF5,0xC6,0xE3,0x53,0x3B,0x15,0xBA,0xA1,0xE3,0x2B,0x9E,0xE2,0x2B,0x9E,0x99,0x99,0x43,0x44,0xC4,0xAA,0xAA,0xA6,0xAA,0xAA,0x00,0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00, 289 | 0x6A,0x92,0xC9,0x98,0x24,0x63,0x32,0x0A,0x9C,0xA0,0x09,0x9C,0x80,0x77,0x77,0x1F,0x22,0x22,0x56,0x55,0x15,0x55,0x55,0x15,0x00,0x00,0xF8,0xFF,0xFF,0x03,0x00,0x00, 290 | 0xB3,0x2C,0xCB,0x18,0x93,0x31,0x8B,0xAF,0xD8,0x8A,0xAF,0x78,0x66,0x66,0x06,0x11,0x11,0xB1,0xAA,0xAA,0xA6,0xAA,0xAA,0x02,0x00,0x00,0xFE,0xFF,0xFF,0x01,0x00,0x00, 291 | 0x48,0x05,0xEE,0xE1,0x1E,0x27,0x70,0xE2,0x26,0x70,0x02,0xDE,0xDD,0x5D,0x88,0x88,0x88,0x55,0x55,0x15,0x55,0x55,0x55,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x00, 292 | 0x6A,0x0F,0xF7,0xF0,0x2B,0xBE,0xC2,0x2B,0xBE,0xE2,0x99,0x99,0x99,0x43,0x44,0x44,0xAC,0xAA,0xAA,0xA6,0xAA,0xAA,0x0A,0x00,0x00,0xE0,0xFF,0xFF,0x7F,0x00,0x00,0x00, 293 | 0x0D,0xDD,0x10,0x9C,0xC0,0xE9,0x9B,0xC0,0x09,0x78,0x77,0x77,0x1F,0x22,0x22,0x62,0x55,0x55,0x15,0x55,0x55,0x55,0x01,0x00,0x00,0xF8,0xFF,0xFF,0x3F,0x00,0x00,0x00, 294 | 0x86,0x8E,0xAF,0xF8,0x6A,0xAF,0xF8,0x8A,0x67,0x66,0x66,0x06,0x11,0x11,0x11,0xAB,0xAA,0xAA,0xA6,0xAA,0xAA,0x2A,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x1F,0x00,0x00,0x00, 295 | 0x28,0x70,0x02,0x07,0x70,0x02,0x27,0xE0,0xDD,0xDD,0x5D,0x88,0x88,0x88,0x58,0x55,0x55,0x15,0x55,0x55,0x55,0x05,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00, 296 | 0xBE,0xE2,0x0B,0xBE,0xE2,0x2B,0x9E,0x99,0x99,0x99,0x43,0x44,0x44,0xC4,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00, 297 | 0x09,0x7C,0xC0,0x09,0x9C,0x80,0x77,0x77,0x77,0x1F,0x22,0x22,0x22,0x56,0x55,0x55,0x15,0x55,0x55,0x55,0x15,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00, 298 | 0x8F,0xF8,0x8A,0xAF,0x78,0x66,0x66,0x66,0x06,0x11,0x11,0x11,0xB1,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0x02,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00, 299 | 0x02,0x27,0x70,0x02,0xDE,0xDD,0xDD,0x5D,0x88,0x88,0x88,0x88,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 300 | 0x2B,0xBE,0xE2,0x99,0x99,0x99,0x99,0x43,0x44,0x44,0x44,0xAC,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0x0A,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00, 301 | 0xC0,0x09,0x78,0x77,0x77,0x77,0x1F,0x22,0x22,0x22,0x62,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x01,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00, 302 | 0x8A,0x67,0x66,0x66,0x66,0x06,0x11,0x11,0x11,0x11,0xAB,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0x2A,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00, 303 | 0xE0,0xDD,0xDD,0xDD,0x5D,0x88,0x88,0x88,0x88,0x58,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x05,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00, 304 | 0x99,0x99,0x99,0x99,0x43,0x44,0x44,0x44,0xC4,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00, 305 | 0x77,0x77,0x77,0x1F,0x22,0x22,0x22,0x22,0x56,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x15,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00, 306 | 0x66,0x66,0x06,0x11,0x11,0x11,0x11,0xB1,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0x02,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00, 307 | 0xDD,0x5D,0x88,0x88,0x88,0x88,0x88,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, 308 | 0x99,0x43,0x44,0x44,0x44,0x44,0xAC,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0x0A,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00, 309 | 0x1F,0x22,0x22,0x22,0x22,0x62,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x01,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00, 310 | 0x11,0x11,0x11,0x11,0x11,0xAB,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0x2A,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00, 311 | 0x88,0x88,0x88,0x88,0x58,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x05,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00, 312 | 0x44,0x44,0x44,0xC4,0xAA,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00, 313 | 0x22,0x22,0x22,0x56,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x15,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00, 314 | 0x11,0x11,0xB1,0xAA,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0x02,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00, 315 | 0x88,0x88,0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, 316 | 0x44,0xAC,0xAA,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0x0A,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, 317 | 0x62,0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00, 318 | 0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00, 319 | 0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00, 320 | 0xAA,0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 321 | 0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 322 | 0xAA,0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 323 | 0x55,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 324 | 0xAA,0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 325 | 0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 326 | 0xAA,0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 327 | 0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 328 | 0xAA,0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 329 | 0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 330 | 0xA6,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 331 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 332 | 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 333 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 334 | 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 335 | 0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 336 | 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 337 | 0x55,0x55,0x55,0x55,0x55,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 338 | 0xAA,0xAA,0xAA,0xAA,0xAA,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 339 | 0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 340 | 0xAA,0xAA,0xAA,0xAA,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 341 | 0x55,0x55,0x55,0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 342 | 0xAA,0xAA,0xAA,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 343 | 0x55,0x55,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 344 | 0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 345 | 0x55,0x55,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 346 | 0xAA,0xAA,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 347 | 0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 348 | 0xAA,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 349 | 0x55,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 350 | 0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 351 | 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 352 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 353 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 354 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 355 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 356 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 357 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 358 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 359 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 360 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 361 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 362 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 363 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 364 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 365 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 366 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 367 | 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 368 | 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 369 | 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 370 | 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 371 | 0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 372 | 0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 373 | 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 374 | 0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 375 | 0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 376 | 0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 377 | 0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 378 | 0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 379 | 0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 380 | 0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 381 | 0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 382 | 0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 383 | 0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 384 | 0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 385 | 0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 386 | 0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 387 | 0x00,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 388 | 0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 389 | 0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 390 | 0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 391 | 0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 392 | 0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 393 | 0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 394 | 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 395 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 396 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 397 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 398 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 399 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 400 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 401 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 402 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 403 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 404 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 405 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 406 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 407 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 408 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 409 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 410 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 411 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 412 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 413 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 414 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 415 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 416 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 417 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 418 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 419 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 420 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 421 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 422 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 423 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 424 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 425 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 426 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 427 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 428 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 429 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 430 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 431 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 432 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 433 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 434 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 435 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 436 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 437 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 438 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 439 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 440 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 441 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 442 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 443 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 444 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 445 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 446 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 447 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 448 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 449 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 450 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 451 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 452 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 453 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 454 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 455 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 456 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 457 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 458 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 459 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 460 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 461 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 462 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 463 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 464 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 465 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 466 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 467 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 468 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 469 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 470 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 471 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 472 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 473 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 474 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 475 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 476 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 477 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 478 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 479 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 480 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 481 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 482 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 483 | 0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 484 | 0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 485 | 0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 486 | 0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 487 | 0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 488 | 0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 489 | 0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 490 | 0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 491 | 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 492 | 0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 493 | 0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 494 | 0xFF,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 495 | 0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 496 | 0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 497 | 0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 498 | 0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 499 | 0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 500 | 0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 501 | 0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 502 | 0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 503 | 0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 504 | 0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 505 | 0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 506 | 0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 507 | 0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 508 | 0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 509 | 0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 510 | 0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 511 | 0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 512 | 0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 513 | 0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 514 | 0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 515 | 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 516 | 0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 517 | 0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 518 | 0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 519 | 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 520 | 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 521 | 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 522 | 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 523 | }; 524 | 525 | #endif -------------------------------------------------------------------------------- /ofixed_constants.h.template: -------------------------------------------------------------------------------- 1 | #ifndef OFIXED_CONSTANTS_H 2 | #define OFIXED_CONSTANTS_H 3 | 4 | #define OFIXED_LN_NORMALIZE_INT_BITS NORMALIZE_INT_BITS_TEMPLATEll 5 | #define OFIXED_LN_INPUT_PRECISION INPUT_PRECISION_TEMPLATEll 6 | #define OFIXED_LN_OUTPUT_PRECISION OUTPUT_PRECISION_TEMPLATEll 7 | 8 | char ofixed_ln_normalize_factors[] = NORMALIZE_FACTORS_TEMPLATE; 9 | 10 | char ofixed_ln_log_components[] = LOG_COMPONENTS_TEMPLATE; 11 | 12 | #endif -------------------------------------------------------------------------------- /util.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include"util.h" 7 | 8 | double wallClock() 9 | { 10 | struct timespec t; 11 | clock_gettime(CLOCK_REALTIME,&t); 12 | return t.tv_sec+1e-9*t.tv_nsec; 13 | } 14 | 15 | void ocTestUtilTcpOrDie(ProtocolDesc* pd,const char* remote_host, 16 | const char* port) 17 | { 18 | if(!remote_host) 19 | { if(protocolAcceptTcp2P(pd,port)!=0) 20 | { fprintf(stderr,"TCP accept failed\n"); 21 | exit(1); 22 | } 23 | } 24 | else 25 | if(protocolConnectTcp2P(pd,remote_host,port)!=0) 26 | { fprintf(stderr,"TCP connect failed\n"); 27 | exit(1); 28 | } 29 | } 30 | 31 | //hex, int, char conversion functions 32 | int hex_to_int(char c){ 33 | int first = c / 16 - 3; 34 | int second = c % 16; 35 | int result = first*10 + second; 36 | if(result > 9) result--; 37 | return result; 38 | } 39 | 40 | int hex_to_ascii(char c, char d){ 41 | int high = hex_to_int(c) * 16; 42 | int low = hex_to_int(d); 43 | return high+low; 44 | } 45 | 46 | void hex_string_to_char_array(const char * hex_string) { 47 | int length = strlen(hex_string); 48 | int i; 49 | char buf = 0; 50 | 51 | for(i = 0; i < length; i++){ 52 | if(i % 2 != 0){ 53 | printf("%i\n", hex_to_ascii(buf, hex_string[i])); 54 | 55 | }else{ 56 | buf = hex_string[i]; 57 | } 58 | } 59 | 60 | } 61 | 62 | bool compare(uint8_t *x, uint8_t *y, int len) { 63 | for (int i = 0; i < len; i++) { 64 | if (x[i] != y[i]) { 65 | return false; 66 | } 67 | } 68 | 69 | return true; 70 | } 71 | 72 | -------------------------------------------------------------------------------- /util.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | void ocTestUtilTcpOrDie(struct ProtocolDesc* pd,const char* remote_host, 4 | const char* port); 5 | double wallClock(); 6 | 7 | int hex_to_int(char c); 8 | 9 | int hex_to_ascii(char c, char d); 10 | 11 | void hex_string_to_char_array(const char * hex_string); 12 | 13 | bool compare(uint8_t *x, uint8_t *y, int len); 14 | -------------------------------------------------------------------------------- /utility.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | 4 | SCALE = 1000000000 5 | 6 | def secure_aggregate_laplace(vectors, noise_scale, useMPC=False): 7 | if useMPC == False: 8 | return np.mean(vectors, axis=0) + noise_scale * np.random.laplace(0, 1, vectors.shape[1]) 9 | 10 | vectors = (vectors*SCALE).astype(int) 11 | vectors_mask = np.random.randint(-SCALE, SCALE, vectors.shape) 12 | random_vals = np.random.randint(-SCALE, SCALE, vectors.shape) 13 | fp1 = open('Inputs/beta1.txt', 'w') 14 | fp2 = open('Inputs/beta2.txt', 'w') 15 | fp3 = open('Inputs/random_vals.txt', 'w') 16 | for i in range(vectors.shape[0]): 17 | for j in range(vectors.shape[1]): 18 | fp1.write(str(vectors[i,j]^vectors_mask[i,j])+ ' ') 19 | fp2.write(str(vectors_mask[i,j])+ ' ') 20 | fp3.write(str(random_vals[i,j])+ ' ') 21 | fp1.close() 22 | fp2.close() 23 | fp3.close() 24 | 25 | port = 1234 26 | 27 | # Note: Currently, M, D, lambda, epsilon and chunk size for each party are all hard coded in modelAggregate.c and modelAggregate.oh files. 28 | os.system("./cycle 'model_aggregate_laplace/a.out "+str(port)+" -- dualex | model_aggregate_laplace/a.out "+str(port)+" localhost dualex'") 29 | 30 | fp = open('Output/beta_avg.txt', 'r') 31 | beta = [] 32 | for line in fp: 33 | beta = [float(val) for val in line.split(' ')[:-1]] 34 | fp.close() 35 | 36 | return np.array(beta) 37 | 38 | 39 | def ratio_of_uniforms(): 40 | u1 = np.random.rand() 41 | v2 = np.random.rand() 42 | u2 = (2*v2 - 1) * np.sqrt(2*np.exp(-1)) 43 | x = u2 / u1 44 | while x*x > -4 * np.log(u1): 45 | u1 = np.random.rand() 46 | v2 = np.random.rand() 47 | u2 = (2*v2 - 1) * np.sqrt(2*np.exp(-1)) 48 | x = u2 / u1 49 | return x 50 | 51 | 52 | def secure_aggregate_gaussian(vectors, noise_scale, useMPC=False): 53 | if useMPC == False: 54 | return np.mean(vectors, axis=0) + noise_scale * np.random.normal(0, 1, vectors.shape[1]) 55 | #return np.mean(vectors, axis=0) + noise_scale * [ratio_of_uniforms() for i in np.arange(vectors.shape[1])] 56 | 57 | vectors = (vectors*SCALE).astype(int) 58 | vectors_mask = np.random.randint(-SCALE, SCALE, vectors.shape) 59 | noise_scale = int(noise_scale*SCALE) 60 | noise_scale_mask = np.random.randint(-SCALE, SCALE) 61 | fp1 = open('Inputs/beta1.txt', 'w') 62 | fp2 = open('Inputs/beta2.txt', 'w') 63 | fp3 = open('Inputs/noise1.txt', 'w') 64 | fp4 = open('Inputs/noise2.txt', 'w') 65 | for i in range(vectors.shape[0]): 66 | for j in range(vectors.shape[1]): 67 | fp1.write(str(vectors[i,j]^vectors_mask[i,j])+ ' ') 68 | fp2.write(str(vectors_mask[i,j])+ ' ') 69 | fp3.write(str(noise_scale^noise_scale_mask)+ ' ') 70 | fp4.write(str(noise_scale_mask)+ ' ') 71 | fp1.close() 72 | fp2.close() 73 | fp3.close() 74 | fp4.close() 75 | 76 | port = 1234 77 | ret = 1 78 | 79 | while ret != 0: 80 | random1 = (np.random.rand(vectors.shape[1])*SCALE).astype(int) 81 | random2 = (np.random.rand(vectors.shape[1])*SCALE).astype(int) 82 | mask1 = np.random.randint(-SCALE, SCALE, vectors.shape[1]) 83 | mask2 = np.random.randint(-SCALE, SCALE, vectors.shape[1]) 84 | fp1 = open('Inputs/random11.txt', 'w') 85 | fp2 = open('Inputs/random12.txt', 'w') 86 | fp3 = open('Inputs/random21.txt', 'w') 87 | fp4 = open('Inputs/random22.txt', 'w') 88 | for i in range(vectors.shape[1]): 89 | fp1.write(str(random1[i]^mask1[i])+ ' ') 90 | fp2.write(str(mask1[i])+ ' ') 91 | fp3.write(str(random2[i]^mask2[i])+ ' ') 92 | fp4.write(str(mask2[i])+ ' ') 93 | fp1.close() 94 | fp2.close() 95 | fp3.close() 96 | fp4.close() 97 | 98 | ret = os.system("./cycle 'model_aggregate_gaussian/a.out "+str(port)+" -- dualex "+str(vectors.shape[0])+" "+str(vectors.shape[1])+" | model_aggregate_gaussian/a.out "+str(port)+" localhost dualex "+str(vectors.shape[0])+" "+str(vectors.shape[1])+"'") 99 | 100 | fp = open('Output/beta_avg.txt', 'r') 101 | beta = [] 102 | for line in fp: 103 | beta = [float(val) for val in line.split(' ')[:-1]] 104 | fp.close() 105 | 106 | return np.array(beta) 107 | --------------------------------------------------------------------------------