From 02e0d1d86f143859d0dcf73a3fc1be0b7b2f2310 Mon Sep 17 00:00:00 2001 From: eason <30045503+Eason0729@users.noreply.github.com> Date: Thu, 21 Dec 2023 00:47:36 +0800 Subject: [PATCH] last try on XorLinkList --- CMakeLists.txt | 4 +- homework_11 | Bin 38488 -> 39312 bytes include/clock.h | 12 +- include/linklist.h | 3 + justfile | 5 + src/linklist.c | 43 +- src/main.c | 60 -- src/rust.c | 2 +- src/state.c | 4 +- src/v1.c | 15 +- src/v2.c | 84 ++- src/v3.c | 58 +- trace_file.txt | 1365 +------------------------------------------- 13 files changed, 149 insertions(+), 1506 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69d9873..9222de0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,8 +13,8 @@ include_directories(/usr/include) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64-v3" CACHE STRING "Set C Compiler Flags to use x86 feature level V3" FORCE) # set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -I -march=x86-64-v3" CACHE STRING "Set C++ Compiler Flags to use x86 feature level V3" FORCE) -set(CMAKE_C_FLAGS_RELEASE_INIT "${CMAKE_C_FLAGS} -Ofast -flto") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${CMAKE_CXX_FLAGS} -Ofast -flto") +set(CMAKE_C_FLAGS_RELEASE_INIT "${CMAKE_C_FLAGS} -O3 -flto") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${CMAKE_CXX_FLAGS} -O3 -flto") set(SOURCES include/hashmap.h diff --git a/homework_11 b/homework_11 index eb83d4e797c6e4c8edbe377bae325c21fc46b62e..2e7b461f703287e2a11f3615ffcbcbf081589deb 100755 GIT binary patch literal 39312 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 Yh69><4K15D5&zu#6-7%1Lq<{jUx)U(rT_o{ literal 38488 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 #include "rust.h" struct Node{ @@ -8,6 +9,8 @@ struct Node{ struct Node* xor_new(void * val); struct Node* xor_next(struct Node* previous,struct Node* current); struct Node* xor_insert_front(struct Node* head,void* val); +struct Node* xor_insert_condition(struct Node* head,void* val,bool (*cmp)(void *,void *)); struct Node* xor_insert_mid(struct Node* previous,struct Node* current,void * val); +void debug_head(struct Node* head); void * xor_remove(struct Node * previous,struct Node* current); usize xor_count(struct Node* head); \ No newline at end of file diff --git a/justfile b/justfile index de31b64..447047b 100644 --- a/justfile +++ b/justfile @@ -17,5 +17,10 @@ run: make VERBOSE=1 ./homework_11 +mem-test: + cmake -DCMAKE_C_FLAGS="-fsanitize=address -fstandalone-debug" -DCMAKE_BUILD_TYPE=Debug -C clang-cmakeinit.cmake . + make VERBOSE=1 + ./homework_11 + clean: rm -fr CMakeFiles build CMakeCache.txt Makefile cmake_install.cmake *.csv *.profdata *.profraw \ No newline at end of file diff --git a/src/linklist.c b/src/linklist.c index ccb9f40..874891b 100644 --- a/src/linklist.c +++ b/src/linklist.c @@ -10,18 +10,22 @@ struct Node{ __INTPTR_TYPE__ xor_; }; +// shortcut for xor_insert_mid(NULL,NULL,val) struct Node* xor_new(void * val){ struct Node* node=malloc(sizeof(struct Node)); node->xor_=(__INTPTR_TYPE__)NULL; node->val=val; + return node; } +// find next node struct Node* xor_next(struct Node* previous,struct Node* current){ if(current==NULL) return NULL; return (struct Node*)((current->xor_)^((__INTPTR_TYPE__)previous)); } +// insert node at middle, return new node struct Node* xor_insert_mid(struct Node* previous,struct Node* current,void * val){ struct Node* node=malloc(sizeof(struct Node)); if(previous!=NULL)previous->xor_^=((__INTPTR_TYPE__)current)^((__INTPTR_TYPE__)node); @@ -31,11 +35,33 @@ struct Node* xor_insert_mid(struct Node* previous,struct Node* current,void * va return node; } +// insert randomly, return new node struct Node* xor_insert_front(struct Node* head,void* val){ struct Node* next=xor_next(NULL,head); return xor_insert_mid(head,next,val); } +// insert after the element that make cmp return true, insert at front if not found, return new head +struct Node* xor_insert_condition(struct Node* head,void* val,bool (*cmp)(void *,void *)){ + if(head==NULL) return xor_new(val); + struct Node* previous=NULL; + struct Node* current=head; + + usize amount=0; + while(current!=NULL){ + struct Node* next=xor_next(previous,current); + if(!cmp(val,current->val)){ + xor_insert_mid(current,next,val); + return head; + } + previous=current; + current=next; + } + + return xor_insert_mid(NULL,head,val); +} + +// remove current, return next struct Node * xor_remove(struct Node * previous,struct Node* current){ // printf("previous: %zu, current: %zu\n",previous,current); struct Node * next=xor_next(previous,current); @@ -52,7 +78,6 @@ usize xor_count(struct Node* head){ usize amount=0; while(current!=NULL){ struct Node* next=xor_next(previous,current); - // printf("previous: %zu, current: %zu, next: %zu\n",previous,current,next); struct SizedSubmask* mask=current->val; amount++; @@ -62,6 +87,22 @@ usize xor_count(struct Node* head){ return amount; } +void debug_head(struct Node* head){ + struct Node* previous=NULL; + struct Node* current=head; + + printf("start of address:"); + while(current!=NULL){ + struct Node* next=xor_next(previous,current); + struct SizedSubmask* mask=current->val; + + printf("%zu ,",current); + + previous=current; + current=next; + } + printf("\n"); +} // int test() // { // usize my_item=10; diff --git a/src/main.c b/src/main.c index 2c2d890..ee74924 100644 --- a/src/main.c +++ b/src/main.c @@ -12,72 +12,12 @@ int main() struct State state; state.head=NULL; - printf("\x1B[34mWelcome to homework 11 (HW11)!\x1B[0m\nDoes it look very familiar?\n\n"); - input(&state); - printf(" [ \x1B[32mOK\x1B[0m ] Reached target \x1B[33minput\x1B[0m.\n"); length_distribution(&state); - printf(" [ \x1B[32mOK\x1B[0m ] Reached target \x1B[33mlength_distribution\x1B[0m.\n"); segment(&state); - printf(" [ \x1B[32mOK\x1B[0m ] Reached target \x1B[33msegment\x1B[0m.\n"); prefix_insert(&state); - printf(" [ \x1B[32mOK\x1B[0m ] Reached target \x1B[33mprefix_insert\x1B[0m.\n"); prefix_delete(&state); - printf(" [ \x1B[32mOK\x1B[0m ] Reached target \x1B[33mprefix_delete\x1B[0m.\n"); search(&state); - printf(" [ \x1B[32mOK\x1B[0m ] Reached target \x1B[33msearch\x1B[0m.\n"); return 0; } - -// struct Point{ -// usize x; -// usize y; -// }; - -// bool eqa(void* x,void* y){ -// struct Point* a=x; -// struct Point* b=y; -// return (a->x==b->x)&&(a->y==b->y); -// } -// usize hashera(void* a){ -// struct Point* p=a; -// return (p->x)+(p->y)/2; -// } - -// int main() -// { -// struct HashMap map; -// hash_new(&map,hashera,eqa); - -// // struct Point pa; -// // usize va=2; -// // pa.x=2; -// // pa.y=7; -// // struct Point pb; -// // usize vb=3; -// // pb.x=1; -// // pb.y=9; -// // hash_insert(&map,&pa,&va); -// // hash_insert(&map,&pb,&vb); - -// // printf("pa has address of %zu\npb has address of %zu\n",&pa,&pb); - -// // usize * assert=hash_get(&map,&pb); -// // printf("address: %zu\n",assert); -// // printf("value: %zu\n",*assert); - - -// for(usize i=0;isize); -// // for(usize j=0;jlist[j].key; -// // struct Node* ll=entry->list[j].val; -// // // usize count=xor_count(ll); -// // printf("one entry\n"); -// // // printf("There are _ prefix in group %u\n",mask->mask.raw); -// // } -// } -// return 0; -// } \ No newline at end of file diff --git a/src/rust.c b/src/rust.c index 98bdcfa..fcfdec8 100644 --- a/src/rust.c +++ b/src/rust.c @@ -12,7 +12,7 @@ void panic(char * msg){ fprintf(stderr," [\x1B[31mERROR\x1B[0m ] %s\n",msg); - exit(1); + *NULL; } void log_warn(char * msg){ fprintf(stderr," [ \x1B[33mWARN\x1B[0m ] %s\n",msg); diff --git a/src/state.c b/src/state.c index 2f3d95c..cf0268b 100644 --- a/src/state.c +++ b/src/state.c @@ -27,11 +27,11 @@ usize parse_number(char** cstr_ptr){ } usize display_submask(struct SizedSubmask *mask){ - printf("%3hd.%hd.%hd.%hd/%zu",mask->mask.mask[3],mask->mask.mask[2],mask->mask.mask[1],mask->mask.mask[0],mask->len); + printf("%hd.%hd.%hd.%hd/%zu",mask->mask.mask[3],mask->mask.mask[2],mask->mask.mask[1],mask->mask.mask[0],mask->len); } usize display_ip(struct SizedSubmask *mask){ - printf("%3hd.%3hd.%3hd.%3hd",mask->mask.mask[3],mask->mask.mask[2],mask->mask.mask[1],mask->mask.mask[0]); + printf("%hd.%hd.%hd.%hd",mask->mask.mask[3],mask->mask.mask[2],mask->mask.mask[1],mask->mask.mask[0]); } void parse_submask(char* cstr, struct SizedSubmask *mask){ diff --git a/src/v1.c b/src/v1.c index 5163c3f..c5d6aed 100644 --- a/src/v1.c +++ b/src/v1.c @@ -8,21 +8,17 @@ void input(struct State* state){ FILE * table = fopen("routing_table.txt","r"); - struct Node* head=NULL; while(true){ char buffer[20]={'\0'}; fgets(buffer,20,table); if(*buffer=='\0') break; struct SizedSubmask* mask=malloc(sizeof(struct SizedSubmask)); - // printf("address of new mask: %zu\n",mask); parse_submask(buffer,mask); + if(mask<10000)printf("%zu\n",mask); - if(head==NULL)head=xor_new(mask); - else head=xor_insert_mid(NULL,head,mask); + state->head=xor_insert_mid(NULL,state->head,mask); } - - state->head=head; } void length_distribution(struct State* state){ @@ -36,13 +32,10 @@ void length_distribution(struct State* state){ struct SizedSubmask* mask=current->val; lens[mask->len]++; - // printf("address of scanning mask: %zu\n",mask); - previous=current; current=next; } - for(usize i=0;i<=32;i++){ - if(lens[i]!=0) printf(" There are %5zu prefix which have prefix len of %2zu\n",lens[i],i); - } + for(usize i=0;i<=32;i++) + printf("the number of prefixes with prefix length %zu = %zu\n",i,lens[i]); } \ No newline at end of file diff --git a/src/v2.c b/src/v2.c index 7059cb1..a26a3fc 100644 --- a/src/v2.c +++ b/src/v2.c @@ -14,55 +14,89 @@ bool eq(void* a,void* b){ return mask_a->mask.raw==mask_b->mask.raw; } +bool cmp(void* a,void* b){ + struct SizedSubmask* mask_a=a; + struct SizedSubmask* mask_b=b; + return mask_a->mask.raw>mask_b->mask.raw;// for debug +} + usize hasher(void* a){ struct SizedSubmask* mask=a; return mask->mask.raw; } +void print_binary(usize j){ + for(size_t i=1;i<=D;i++){ + printf("%s",(0==(j&(1<<(D-i))))?"0":"1"); + } +} + // std::collections::HashMap> void segment(struct State* state){ - printf(" \'d\' is %2d, and empty group are skipped!\n",D); - state->hashmap=malloc(sizeof(struct HashMap)); hash_new(state->hashmap,hasher,eq); - struct Node* previous=NULL; struct Node* current=state->head; + + state->head=NULL; while (current!=NULL){ struct SizedSubmask* mask= current->val; struct SizedSubmask* ip=clone_submask(mask); + current=xor_remove(NULL,current); if(reduce_submask(mask)){ - current=xor_remove(previous,current); - struct Node* ll=hash_get(state->hashmap,mask); - if(ll==NULL){ - struct Node* ll=xor_new(ip); - hash_insert(state->hashmap,mask,ll); - }else{ - xor_insert_front(ll,ip); - free(mask); - } + struct Node* ll=hash_pop(state->hashmap,mask); + struct Node* new=xor_insert_mid(NULL,ll,ip); + hash_insert(state->hashmap,mask,new); }else{ + state->head=xor_insert_condition(state->head,ip,cmp); + free(mask); + } + } + + // C suck! we need iterator! + for(usize i=0;i<(1<hashmap,&mask); + struct Node* previous=NULL; + + while(current!=NULL){ struct Node* next=xor_next(previous,current); + + printf(" ---> | "); + display_ip(current->val); + printf(" |"); + previous=current; current=next; - free(ip); } + printf("\n"); } - state->head=previous; + { + printf("--------special group--------\n"); - for(usize i=0;ihashmap->entry+i; - for(usize j=0;jsize;j++){ - struct SizedSubmask* mask=entry->list[j].key; - struct Node* ll=entry->list[j].val; - usize count=xor_count(ll); - if(count!=0){ - printf(" There are %5zu prefix in group %10u (",count,mask->mask.raw); - display_submask(mask); - printf(")\n"); - } + struct Node* current=state->head; + struct Node* previous=NULL; + + while(current!=NULL){ + struct Node* next=xor_next(previous,current); + + display_ip(current->val); + printf("\n"); + + previous=current; + current=next; } + + printf("-----------------------------\n"); } + } \ No newline at end of file diff --git a/src/v3.c b/src/v3.c index bff19d8..3467c3f 100644 --- a/src/v3.c +++ b/src/v3.c @@ -13,35 +13,41 @@ bool eq_v3(void* a,void* b){ return mask_a->mask.raw==mask_b->mask.raw; } +// remove match element, return new head struct Node* xor_remove_match(struct Node* head,void* target,bool (*eq)(void *,void *)){ struct Node* previous=NULL; struct Node* current=head; + struct Node* next=NULL; while(current!=NULL){ - struct Node* next=xor_next(previous,current); if(eq(current->val,target)){ free(current->val); - xor_remove(previous,current); + next=xor_remove(previous,current); break; } + struct Node* next=xor_next(previous,current); + previous=current; current=next; } - if(previous==NULL) return xor_next(previous,current); - return NULL; + if(previous==NULL) return next; + else return head; } bool xor_contain(struct Node* head,void* target,bool (*eq)(void *,void *)){ struct Node* previous=NULL; struct Node* current=head; + usize round=0; while(current!=NULL){ + // if(current<((usize)100000)) break; + // printf("current: %zu, previous: %zu, round: %zu\n",current,previous, ++round); struct Node* next=xor_next(previous,current); if(eq(current->val,target)){ - return false; + return true; } previous=current; current=next; } - return true; + return false; } void prefix_insert(struct State* state){ @@ -61,20 +67,11 @@ void prefix_insert(struct State* state){ record_start if(reduce_submask(mask)){ - struct Node* ll=hash_get(state->hashmap,mask); - if(ll==NULL){ - struct Node* ll=xor_new(ip); - hash_insert(state->hashmap,mask,ll); - }else{ - xor_insert_front(ll,ip); - free(mask); - } - }else{ - free(ip); - if(state->head==NULL)state->head=xor_new(mask); - else state->head=xor_insert_mid(NULL,state->head,mask); - } - + struct Node* ll=hash_pop(state->hashmap,mask); + struct Node* new=xor_insert_mid(NULL,ll,ip); + hash_insert(state->hashmap,mask,new); + }else state->head=xor_insert_mid(NULL,state->head,ip); + record_end("prefix_insert.csv") freq++; @@ -93,7 +90,6 @@ void prefix_delete(struct State* state){ fgets(buffer,20,table); if(*buffer=='\0') break; - struct SizedSubmask* mask=malloc(sizeof(struct SizedSubmask)); parse_submask(buffer,mask); struct SizedSubmask* ip=clone_submask(mask); @@ -102,19 +98,10 @@ void prefix_delete(struct State* state){ if(reduce_submask(mask)){ struct Node* ll=hash_pop(state->hashmap,mask); - if(ll==NULL) { - log_warn("removal fail, cannot find index!"); - goto drop; - } struct Node* new_head=xor_remove_match(ll,ip,eq_v3); - if(new_head==NULL) hash_insert(state->hashmap,mask,ll); - else hash_insert(state->hashmap,mask,new_head); + if(new_head!=NULL) hash_insert(state->hashmap,mask,new_head); }else{ struct Node* ll=state->head; - if(ll==NULL) { - log_warn("removal fail, cannot find index!"); - goto drop; - } struct Node* new_head=xor_remove_match(ll,ip,eq_v3); if(new_head!=NULL) state->head=new_head; } @@ -122,9 +109,7 @@ void prefix_delete(struct State* state){ record_end("prefix_delete.csv") - drop: free(ip); - free(mask); } clock_end @@ -154,11 +139,10 @@ void search(struct State* state){ record_end("search.csv") - printf(" submask: "); - display_ip(ip); + debug_head(ll); - if (xor_contain(ll,ip,eq_v3)) printf(" can be found among entries\n"); - else printf(" cannot be found among entries\n"); + if (xor_contain(ll,ip,eq_v3)) printf("successful\n"); + else printf("failed\n"); free(ip); free(mask); diff --git a/trace_file.txt b/trace_file.txt index 3a4f2ef..296974b 100644 --- a/trace_file.txt +++ b/trace_file.txt @@ -1,1364 +1,7 @@ -1.0.0.0 -51.154.241.157 -51.203.21.93 -4.0.0.0 -4.1.18.0 -4.2.62.0 -4.2.63.0 -4.2.90.0 -4.2.124.0 -4.2.124.0 -4.6.0.0 -4.6.0.0 -4.6.4.0 -4.6.8.0 -4.6.62.0 -4.6.68.0 -4.6.72.0 -4.6.76.0 -4.6.80.0 -4.6.81.0 -4.6.82.0 -4.6.84.0 -11.143.76.221 -4.6.88.0 -14.158.187.190 -4.6.96.0 -4.6.98.0 -4.6.99.0 -4.6.100.0 -4.6.104.0 -4.6.108.0 -4.6.110.0 -4.6.112.0 -4.6.116.0 -14.92.106.205 -4.6.124.0 -4.6.125.0 -6.169.83.120 -4.6.128.0 -4.6.132.0 -4.6.136.0 -4.6.138.0 -4.6.140.0 -4.6.144.0 -4.6.148.0 -4.6.152.0 -4.6.153.0 -56.181.45.175 -4.6.156.0 -4.6.160.0 -4.6.164.0 -4.6.166.0 -4.6.168.0 -25.91.200.248 -4.6.172.0 -4.6.176.0 -4.17.225.0 -4.17.226.0 -4.17.251.0 -4.17.252.0 -4.21.252.0 -4.23.180.0 -4.25.133.40 -4.36.200.0 -4.51.0.0 -4.51.0.0 -4.51.8.0 -4.51.12.0 -25.240.207.106 -4.52.0.0 -4.54.0.0 -4.54.8.0 -4.54.12.0 -4.54.22.0 -4.54.24.0 -4.54.28.0 -4.54.32.0 -4.54.36.0 -4.54.48.0 -4.54.62.0 -4.54.64.0 -4.54.68.0 -11.243.89.193 -56.141.191.166 -4.54.78.0 -4.54.80.0 -4.54.81.0 -4.54.82.0 -4.54.84.0 -0.157.23.12 -4.54.98.0 -4.54.106.0 -4.54.116.0 -4.54.120.0 -4.54.124.0 -4.54.128.0 -4.54.140.0 -4.54.144.0 -4.54.148.0 -4.54.152.0 -4.54.156.0 -4.54.160.0 -4.54.200.0 -4.54.207.0 -4.54.212.0 -4.54.216.0 -9.176.151.131 -4.54.220.0 -4.54.224.0 -4.54.226.0 -4.54.228.0 -4.54.232.0 -4.54.233.0 -4.54.234.0 -4.54.236.0 -4.54.240.0 -4.54.249.0 -4.54.250.0 -4.54.254.0 -4.55.0.0 -4.56.0.0 -4.56.204.0 -4.56.205.0 -4.56.216.0 -4.56.218.0 -4.56.222.0 -4.56.223.0 -4.56.232.0 -4.56.240.0 -4.56.242.0 -4.56.244.0 -4.56.246.0 -4.56.248.0 -4.56.250.0 -4.56.252.0 -4.56.253.0 -4.57.0.0 -4.57.0.0 -4.57.4.0 -4.57.6.0 -4.57.16.0 -4.57.20.0 -4.57.22.0 -4.57.24.0 -4.57.28.0 -51.61.140.47 -4.57.33.0 -4.57.34.0 -4.57.36.0 -0.119.68.198 -0.213.172.191 -4.57.48.0 -4.57.52.0 -4.57.54.0 -4.57.55.0 -9.76.115.113 -4.57.60.0 -4.57.62.0 -54.112.249.145 -51.248.241.6 -4.57.68.0 -4.57.72.0 -4.57.76.0 -4.57.80.0 -4.57.82.0 -4.57.84.0 -4.57.85.0 -4.57.86.0 -4.57.88.0 -4.57.92.0 -4.57.94.0 -4.57.96.0 -4.57.100.0 -4.57.104.0 -4.57.108.0 -4.57.112.0 -4.57.116.0 -4.57.117.0 -4.57.118.0 -4.57.120.0 -4.57.124.0 -4.57.126.0 -4.57.128.0 -4.57.132.0 -4.57.136.0 -4.57.140.0 -4.57.142.0 -4.57.143.0 -4.57.148.0 -20.101.33.255 -9.15.195.146 -4.57.154.0 -4.57.156.0 -4.57.171.0 -4.57.176.0 -4.57.180.0 -4.57.184.0 -4.57.186.0 -4.57.188.0 -22.218.210.34 -4.57.196.0 -4.57.200.0 -4.57.201.0 -4.57.202.0 -4.57.204.0 -25.122.100.172 -4.57.212.0 -4.57.214.0 -4.57.216.0 -4.57.220.0 -4.57.224.0 -4.57.226.0 -4.57.228.0 -4.57.229.0 -4.57.230.0 -21.207.69.67 -4.57.236.0 -4.57.240.0 -4.57.244.0 -4.57.248.0 -4.57.250.0 -4.57.251.0 -4.57.252.0 -4.76.0.0 -4.76.4.0 -4.76.8.0 -4.76.12.0 -4.76.16.0 -4.76.20.0 -4.76.24.0 -4.76.28.0 -4.76.30.0 -51.246.36.25 -4.76.36.0 -4.76.38.0 -4.76.40.0 -29.199.216.15 -4.76.48.0 -26.25.189.92 -4.76.56.0 -19.249.59.160 -4.76.62.0 -4.78.32.0 -5.0.0.0 -6.1.0.0 -19.136.49.107 -6.3.0.0 -6.4.0.0 -6.5.0.0 -6.8.0.0 -6.9.0.0 -6.10.0.0 -6.14.0.0 -6.106.74.32 -7.0.0.0 -8.0.0.0 -10.0.0.0 -12.0.0.0 -12.0.17.0 -12.0.19.0 -12.0.28.0 -28.255.141.97 -12.0.48.0 -12.0.252.0 -12.1.83.0 -0.234.114.167 -12.1.235.0 -11.109.39.241 -12.2.6.0 -12.2.6.0 -12.2.7.0 -12.2.22.0 -12.2.35.0 -12.2.41.0 -12.2.49.0 -12.2.84.0 -12.2.86.0 -12.2.88.0 -12.2.140.0 -12.2.142.0 -29.166.11.250 -12.2.192.0 -12.3.33.0 -12.3.54.0 -12.3.62.0 -12.3.70.0 -12.3.80.0 -12.3.119.0 -12.3.123.0 -12.3.217.0 -12.3.242.0 -12.4.96.0 -12.4.96.0 -12.4.97.0 -12.4.100.0 -12.4.114.0 -29.75.144.239 -12.4.126.0 -12.4.193.0 -12.4.194.0 -12.4.196.0 -12.4.218.0 -12.4.225.0 -12.4.228.0 -12.5.16.0 -12.5.48.0 -12.5.48.0 -12.5.49.0 -12.5.50.0 -12.5.52.0 -12.5.53.0 -12.5.54.0 -12.5.56.0 -12.5.56.0 -12.5.58.0 -12.5.59.0 -12.5.60.0 -12.5.136.0 -12.5.144.0 -12.5.164.0 -12.5.165.0 -12.5.173.0 -12.5.179.0 -12.5.201.0 -12.6.9.0 -12.6.21.0 -12.6.89.0 -12.6.95.0 -12.6.195.0 -19.151.160.66 -12.6.208.0 -12.7.51.0 -12.7.170.0 -12.8.7.0 -12.8.56.0 -12.8.130.0 -12.8.135.0 -12.8.167.0 -12.8.177.0 -12.8.184.0 -12.8.198.0 -12.8.199.0 -12.9.136.0 -12.9.138.0 -0.146.244.75 -12.9.144.0 -12.9.207.0 -12.9.238.0 -29.47.17.134 -12.10.20.0 -12.10.83.0 -12.10.150.0 -12.10.189.0 -12.10.220.0 -12.11.130.0 -6.91.68.106 -12.11.148.0 -12.11.149.0 -12.11.150.0 -0.67.61.38 -12.11.152.0 -12.13.74.0 -12.13.78.0 -12.13.116.0 -12.13.160.0 -12.13.212.0 -12.14.89.0 -12.14.122.0 -12.14.172.0 -12.14.190.0 -12.14.232.0 -12.14.237.0 -12.14.238.0 -12.15.28.0 -12.15.46.0 -12.15.58.0 -12.15.88.0 -12.16.40.0 -12.16.41.0 -12.16.44.0 -12.16.59.0 -12.16.76.0 -12.16.120.0 -12.16.157.0 -12.16.158.0 -12.16.240.0 -12.17.11.0 -12.17.14.0 -12.17.15.0 -12.17.90.0 -12.17.123.0 -12.17.162.0 -12.17.173.0 -12.17.199.0 -12.17.202.0 -12.17.226.0 -12.18.25.0 -12.18.36.0 -12.18.36.0 -20.251.150.242 -12.18.68.0 -12.18.76.0 -12.18.77.0 -12.18.90.0 -12.18.96.0 -127.35.175.228 -12.18.120.0 -12.18.122.0 -12.18.155.0 -12.18.177.0 -12.19.55.0 -12.19.68.0 -12.19.225.0 -12.20.31.0 -12.20.40.0 -12.20.48.0 -12.20.55.0 -12.20.92.0 -12.20.127.0 -12.20.134.0 -12.20.137.0 -12.20.158.0 -12.20.166.0 -12.20.200.0 -12.20.222.0 -12.20.229.0 -12.20.249.0 -12.21.14.0 -12.21.84.0 -127.209.168.86 -12.21.85.0 -12.21.95.0 -12.21.104.0 -12.21.105.0 -12.21.132.0 -12.21.144.0 -12.21.221.0 -12.21.228.0 -12.22.30.0 -12.22.60.0 -12.22.65.0 -12.22.80.0 -12.22.165.0 -0.36.36.38 -12.22.181.0 -12.22.204.0 -12.23.26.0 -12.23.28.0 -0.188.175.40 -12.23.53.0 -56.37.139.28 -12.23.70.0 -11.85.144.26 -12.23.136.0 -12.23.142.0 -12.23.194.0 -12.24.23.0 -12.24.41.0 -12.24.44.0 -12.24.48.0 -12.24.49.0 -12.24.50.0 -12.24.56.0 -12.24.81.0 -51.103.88.10 -12.24.96.0 -12.24.105.0 -12.24.108.0 -12.24.112.0 -12.24.113.0 -12.24.114.0 -12.24.115.0 -12.24.138.0 -12.24.204.0 -12.24.250.0 -12.24.252.0 -12.25.49.0 -12.25.52.0 -12.25.79.0 -12.25.105.0 -12.25.114.0 -12.25.136.0 -12.25.185.0 -12.25.196.0 -12.25.210.0 -12.25.220.0 -12.25.232.0 -12.25.241.0 -12.25.251.0 -12.26.7.0 -56.38.39.83 -12.26.53.0 -12.26.55.0 -12.26.84.0 -12.26.86.0 -12.26.100.0 -12.26.103.0 -12.26.128.0 -12.26.136.0 -12.26.140.0 -12.26.141.0 -12.26.204.0 -12.26.226.0 -12.27.20.0 -12.27.25.0 -12.27.40.0 -12.27.40.0 -22.13.109.68 -12.27.42.0 -12.27.43.0 -12.27.88.0 -12.27.89.0 -12.27.90.0 -12.27.91.0 -12.27.129.0 -12.27.137.0 -12.27.172.0 -11.65.138.196 -12.27.217.0 -12.27.222.0 -12.28.124.0 -12.28.146.0 -12.28.148.0 -43.80.34.27 -12.28.194.0 -12.28.219.0 -12.28.242.0 -127.130.252.213 -12.29.38.0 -12.29.72.0 -12.29.100.0 -12.29.101.0 -12.29.102.0 -12.29.162.0 -12.29.181.0 -12.29.182.0 -12.29.190.0 -12.29.194.0 -12.29.230.0 -12.30.1.0 -12.30.12.0 -12.30.53.0 -12.30.62.0 -12.30.100.0 -12.30.105.0 -12.30.122.0 -12.30.157.0 -11.140.55.37 -12.30.167.0 -12.30.198.0 -12.30.205.0 -12.30.208.0 -12.30.238.0 -12.31.21.0 -12.31.24.0 -12.31.25.0 -12.31.51.0 -12.31.88.0 -12.31.97.0 -12.31.98.0 -12.31.117.0 -12.31.125.0 -22.154.95.31 -12.31.127.0 -12.31.159.0 -12.31.161.0 -12.31.202.0 -12.31.215.0 -12.32.2.0 -12.32.9.0 -12.32.72.0 -12.32.231.0 -12.32.241.0 -12.33.21.0 -12.33.69.0 -12.33.70.0 -12.33.78.0 -12.33.114.0 -12.33.115.0 -12.33.127.0 -12.33.142.0 -12.33.194.0 -12.33.195.0 -12.33.218.0 -12.34.2.0 -12.34.3.0 -12.34.8.0 -12.34.41.0 -12.34.51.0 -30.105.74.165 -12.34.68.0 -0.119.133.166 -127.35.84.169 -12.34.103.0 -12.34.121.0 -12.34.129.0 -12.34.154.0 -12.34.159.0 -12.34.172.0 -12.34.212.0 -12.34.214.0 -12.35.96.0 -12.35.139.0 -12.35.145.0 -12.35.147.0 -12.35.204.0 -12.35.206.0 -0.64.76.158 -12.36.9.0 -12.36.49.0 -12.36.75.0 -12.36.77.0 -9.41.4.221 -12.36.118.0 -12.36.133.0 -12.36.160.0 -12.36.175.0 -12.36.200.0 -12.36.203.0 -12.36.209.0 -12.36.210.0 -12.36.215.0 -12.36.216.0 -12.36.217.0 -12.36.218.0 -12.36.219.0 -12.36.227.0 -12.37.19.0 -12.37.26.0 -12.37.27.0 -12.37.28.0 -12.37.62.0 -12.37.108.0 -12.37.211.0 -12.37.226.0 -12.37.228.0 -12.37.238.0 -12.38.46.0 -12.38.93.0 -12.38.136.0 -12.38.142.0 -12.38.144.0 -12.38.145.0 -12.38.185.0 -12.38.188.0 -12.38.240.0 -12.39.65.0 -12.39.76.0 -12.39.106.0 -12.39.152.0 -12.39.154.0 -12.39.159.0 -12.39.216.0 -12.39.227.0 -12.39.230.0 -46.90.90.134 -12.40.18.0 -12.40.62.0 -12.40.114.0 -12.40.121.0 -12.40.130.0 -29.55.197.48 -12.40.140.0 -12.40.180.0 -20.87.157.59 -12.40.202.0 -12.40.212.0 -12.40.239.0 -12.41.48.0 -12.41.49.0 -12.41.50.0 -12.41.51.0 -12.41.66.0 -29.84.161.120 -12.41.110.0 -12.41.124.0 -12.41.152.0 -12.41.153.0 -12.41.154.0 -12.41.155.0 -12.41.162.0 -12.41.169.0 -47.29.229.249 -12.41.193.0 -12.41.194.0 -12.41.194.0 -12.41.195.0 -12.41.248.0 -12.41.252.0 -12.41.253.0 -12.42.50.0 -12.42.51.0 -12.42.52.0 -12.42.58.0 -12.42.59.0 -12.42.95.0 -12.42.136.0 -12.42.144.0 -12.42.169.0 -12.42.198.0 -12.43.125.0 -12.43.128.0 -12.43.128.0 -22.124.195.207 -12.43.144.0 -12.43.146.0 -12.43.216.0 -12.43.218.0 -12.44.42.0 -12.44.44.0 -12.44.152.0 -12.44.163.0 -12.44.164.0 -12.44.166.0 -34.41.36.16 -12.44.243.0 -12.44.252.0 -127.173.146.113 -12.45.21.0 -12.45.22.0 -12.45.23.0 -12.45.24.0 -12.45.26.0 -12.45.27.0 -6.130.212.199 -12.45.103.0 -12.45.108.0 -12.45.110.0 -12.45.116.0 -12.45.117.0 -12.45.121.0 -12.45.134.0 -12.45.139.0 -12.45.144.0 -12.45.146.0 -12.45.157.0 -12.45.169.0 -12.45.212.0 -12.45.237.0 -12.45.247.0 -12.45.248.0 -12.45.253.0 -12.46.6.0 -12.46.24.0 -12.46.133.0 -12.46.135.0 -12.46.160.0 -43.192.134.109 -12.46.164.0 -12.46.168.0 -12.46.181.0 -12.46.189.0 -12.46.238.0 -12.46.250.0 -12.47.33.0 -12.47.65.0 -12.47.70.0 -12.47.86.0 -21.254.83.127 -26.37.254.210 -12.47.192.0 -12.47.217.0 -12.47.220.0 -12.47.255.0 -12.64.0.0 -34.50.39.183 -12.64.96.0 -12.64.128.0 -46.117.161.26 -12.64.255.0 -12.65.0.0 -12.65.64.0 -12.65.96.0 -47.23.226.168 -12.65.192.0 -12.65.224.0 -12.65.240.0 -12.66.0.0 -12.66.32.0 -12.66.48.0 -47.110.225.188 -12.66.60.0 -12.66.63.0 -12.66.64.0 -0.120.111.131 -12.66.66.0 -12.66.67.0 -12.66.68.0 -12.66.69.0 -12.66.70.0 -12.66.71.0 -12.66.72.0 -12.66.80.0 -12.66.85.0 -12.66.86.0 -12.66.88.0 -12.66.96.0 -12.66.104.0 -12.67.0.0 -12.67.1.0 -12.67.4.0 -12.67.5.0 -12.67.6.0 -12.67.7.0 -48.205.244.197 -12.79.224.0 -12.79.228.0 -12.87.224.0 -12.87.246.0 -12.87.248.0 -12.87.250.0 -12.96.21.0 -12.96.58.0 -12.96.77.0 -14.19.227.77 -12.96.160.0 -12.96.182.0 -12.96.217.0 -12.96.228.0 -12.96.230.0 -12.96.240.0 -12.104.24.0 -12.104.35.0 -12.104.70.0 -12.104.96.0 -12.104.104.0 -12.104.108.0 -12.104.109.0 -12.104.113.0 -12.104.114.0 -12.104.119.0 -12.104.138.0 -12.104.140.0 -12.104.147.0 -12.104.226.0 -12.104.244.0 -12.105.6.0 -12.105.20.0 -12.105.24.0 -12.105.28.0 -12.105.29.0 -56.85.18.190 -34.77.221.194 -12.105.67.0 -12.105.74.0 -12.105.104.0 -12.105.115.0 -12.105.119.0 -12.105.128.0 -12.105.129.0 -12.105.148.0 -12.105.179.0 -12.105.185.0 -12.105.192.0 -12.105.216.0 -12.106.16.0 -12.106.18.0 -26.231.222.64 -12.106.30.0 -12.106.67.0 -12.106.68.0 -12.106.69.0 -12.106.70.0 -12.106.77.0 -12.106.80.0 -30.52.118.81 -12.106.130.0 -12.106.140.0 -52.215.161.59 -12.107.6.0 -12.107.13.0 -12.107.20.0 -12.107.52.0 -12.107.82.0 -12.107.130.0 -12.107.131.0 -11.151.170.146 -12.107.160.0 -12.107.180.0 -12.107.188.0 -12.107.197.0 -20.210.110.41 -12.107.232.0 -12.107.239.0 -12.107.246.0 -12.107.248.0 -12.107.250.0 -12.108.30.0 -12.108.84.0 -12.108.100.0 -12.108.101.0 -12.108.102.0 -12.108.103.0 -12.108.132.0 -12.108.140.0 -12.108.188.0 -12.108.199.0 -12.108.209.0 -12.108.212.0 -43.237.180.243 -12.108.216.0 -12.108.237.0 -12.108.254.0 -12.109.0.0 -12.109.71.0 -12.109.80.0 -12.109.85.0 -12.109.107.0 -12.109.109.0 -12.109.130.0 -29.23.193.55 -12.109.150.0 -12.109.164.0 -12.109.164.0 -12.109.166.0 -12.109.168.0 -12.109.172.0 -12.109.184.0 -12.109.202.0 -12.109.204.0 -12.109.224.0 -12.109.236.0 -12.109.237.0 -12.109.242.0 -34.4.194.59 -12.110.1.0 -12.110.2.0 -12.110.6.0 -12.110.8.0 -12.110.12.0 -12.110.19.0 -12.110.23.0 -12.110.25.0 -12.110.27.0 -12.110.40.0 -12.110.53.0 -12.110.58.0 -25.167.167.247 -12.110.144.0 -12.110.150.0 -12.110.172.0 -12.110.253.0 -12.111.19.0 -12.111.50.0 -12.111.60.0 -12.111.73.0 -12.111.138.0 -12.111.164.0 -12.111.168.0 -12.111.178.0 -12.111.181.0 -12.111.184.0 -12.111.190.0 -12.111.210.0 -12.111.214.0 -12.111.223.0 -12.125.176.22 -12.127.255.255 -11.50.208.177 -12.129.5.0 -25.107.159.121 -12.129.32.0 -12.129.64.0 -12.129.96.0 -12.129.128.0 -12.129.165.0 -54.51.93.30 -12.129.192.0 -12.129.201.0 -12.129.204.0 -12.129.226.0 -12.130.0.0 -12.130.80.0 -12.130.82.0 -54.25.187.188 -12.130.92.0 -12.144.20.0 -12.144.20.0 -12.144.21.0 -12.144.39.0 -12.144.41.0 -12.144.47.0 -12.144.49.0 -12.144.59.0 -12.144.122.0 -12.144.123.0 -127.173.21.211 -12.144.144.0 -12.144.145.0 -12.144.148.0 -12.144.152.0 -12.144.231.0 -19.17.178.68 -12.145.50.0 -12.145.65.0 -12.145.108.0 -12.145.158.0 -11.31.203.63 -12.145.208.0 -12.145.212.0 -12.145.216.0 -12.145.217.249 -12.146.1.0 -12.146.83.0 -12.146.112.0 -12.146.145.0 -0.105.249.208 -12.147.32.0 -12.147.33.0 -12.147.34.0 -12.147.35.0 -12.147.36.0 -28.182.27.96 -12.147.38.0 -12.147.39.0 -12.147.44.0 -12.147.77.0 -12.147.129.0 -12.147.148.0 -12.147.166.0 -12.148.8.0 -12.148.15.0 -12.148.16.0 -12.148.20.0 -12.148.28.0 -12.148.30.0 -12.148.48.0 -12.148.49.0 -12.148.50.0 -12.148.51.0 -12.148.67.0 -12.148.117.0 -12.148.160.0 -12.148.168.0 -12.148.169.0 -12.148.180.0 -12.148.184.0 -12.148.203.0 -12.148.204.0 -12.148.208.0 -11.179.9.108 -12.149.7.0 -12.149.13.0 -12.149.37.0 -12.149.50.0 -12.149.50.0 -12.149.51.0 -12.149.52.0 -12.149.79.0 -6.241.137.60 -12.149.112.0 -12.149.144.0 -12.149.149.0 -12.149.160.0 -12.149.165.0 -12.149.167.0 -12.149.230.0 -12.149.238.0 -20.161.181.109 -12.150.40.0 -12.150.48.0 -12.150.57.0 -12.150.60.0 -12.150.233.0 -12.150.242.0 -12.150.246.0 -12.150.254.0 -12.151.33.0 -12.151.34.0 -12.151.64.0 -12.151.102.0 -12.151.122.0 -12.151.126.0 -12.151.229.0 -12.151.230.0 -12.151.231.0 -12.152.10.0 -12.152.18.0 -12.152.100.0 -12.152.102.0 -12.152.104.0 -12.152.107.0 -12.152.121.0 -12.152.122.0 -12.152.126.0 -12.152.144.0 -12.152.160.0 -12.152.164.0 -12.152.165.0 -12.152.172.0 -12.153.0.0 -12.153.8.0 -12.153.20.0 -12.153.50.0 -12.153.80.0 -12.153.83.0 -12.153.131.0 -12.153.146.0 -12.153.192.0 -12.153.224.0 -12.153.244.0 -12.154.34.0 -12.154.52.0 -12.154.84.0 -29.86.91.54 -21.81.127.20 -12.154.116.0 -12.154.121.0 -12.154.195.0 -12.154.200.0 -12.154.214.0 -12.154.216.0 -47.244.209.194 -12.155.49.0 -12.155.50.0 -12.155.102.0 -12.155.106.0 -12.155.116.0 -12.155.119.0 -12.155.124.0 -12.155.132.0 -26.43.115.246 -12.155.154.0 -12.155.155.0 -12.155.170.0 -12.155.183.0 -12.155.193.0 -12.155.208.0 -12.155.246.0 -9.245.89.211 -12.158.34.0 -12.158.34.0 -12.158.36.0 -12.158.38.0 -12.158.80.0 -12.158.102.205 -21.64.44.97 -12.158.136.0 -12.158.148.0 -12.158.153.0 -12.158.162.0 -12.158.168.0 -12.158.202.0 -12.158.239.0 -46.149.32.231 -12.159.53.0 -12.159.54.0 -12.159.55.0 -12.159.64.0 -12.159.80.0 -12.159.92.0 -12.159.167.0 -12.159.184.0 -12.159.186.0 -26.167.188.54 -12.159.188.0 -22.86.81.44 -12.159.230.0 -12.159.244.0 -12.160.16.0 -12.160.19.0 -12.160.33.0 -12.160.34.0 -30.140.18.163 -54.151.28.133 -12.160.72.0 -12.160.109.0 -12.160.128.0 -12.160.129.0 -12.160.130.0 -12.160.131.0 -12.160.132.0 -12.160.133.0 -12.160.134.0 -12.160.135.0 -29.171.96.169 -12.160.158.0 -12.160.186.0 -12.160.207.0 -12.160.224.0 -12.160.232.0 -12.161.8.0 -12.161.49.0 -12.161.66.0 -12.161.68.0 -12.161.72.0 -12.161.104.0 -12.161.114.0 -28.102.117.235 -12.161.133.0 -12.161.199.0 -34.47.255.192 -12.161.222.0 -12.161.224.0 -12.161.242.0 -25.91.62.155 -12.161.254.0 -14.21.111.221 -12.162.8.0 -12.162.34.0 -12.162.36.0 -12.162.52.0 -12.162.53.0 -12.162.57.0 -12.162.61.0 -40.116.59.100 -12.162.114.0 -12.162.114.0 -12.162.136.0 -12.162.137.0 -12.162.138.0 -12.162.139.0 -12.162.142.0 -12.162.152.0 -12.162.153.0 -12.162.154.0 -12.162.155.0 -12.162.160.0 -12.162.216.0 -12.163.2.0 -12.163.46.0 -12.163.56.0 -12.163.64.0 -12.163.68.0 -12.163.88.0 -12.163.112.0 -12.163.140.0 -21.59.183.243 -54.149.71.92 -12.163.170.0 -12.163.174.0 -12.163.180.0 -12.163.193.0 -12.163.198.0 -12.164.4.0 -12.164.6.0 -12.164.8.0 -12.164.12.0 -12.164.64.0 -12.164.76.0 -12.164.96.0 -12.164.144.0 -12.164.224.0 -12.164.224.0 -12.164.227.0 -12.164.228.0 -12.164.228.0 -12.164.240.0 -12.164.244.0 -12.164.246.0 -12.164.247.0 -12.165.25.0 -12.165.48.0 -12.165.56.0 -12.165.144.0 -12.165.182.0 -12.165.184.0 -12.165.192.0 -12.165.196.0 -12.166.64.0 -12.166.88.0 -12.166.98.0 -9.84.215.219 -12.166.196.0 -12.166.200.0 -14.117.222.239 -12.166.202.0 -12.166.203.0 -12.166.204.0 -34.28.109.107 -12.166.206.0 -12.166.207.0 -12.166.208.0 -12.166.216.0 -12.166.216.0 -12.166.217.0 -6.101.100.108 -12.166.237.0 -12.166.240.0 -12.166.243.0 -12.167.68.0 -12.167.70.0 -12.167.74.0 -12.167.75.0 -12.167.76.0 -56.216.67.42 -12.167.148.0 -12.167.149.0 -12.167.150.0 -12.167.160.0 -12.167.172.0 -28.158.216.140 -12.167.225.0 -12.168.70.0 -12.168.73.0 -12.168.77.0 -12.168.121.0 -12.168.147.0 -12.168.164.0 -12.168.165.0 -12.168.166.0 -12.168.167.0 -12.168.168.0 -12.169.96.0 -12.169.104.0 -12.169.106.0 -12.169.129.0 -21.211.137.60 -12.169.208.0 -12.170.0.0 -12.170.3.0 -12.170.32.0 -12.170.34.0 -12.170.156.0 -43.111.177.205 -54.27.138.54 -12.171.190.0 -12.171.193.0 -12.171.194.0 -12.171.195.0 -12.172.96.0 -12.172.97.0 -12.172.98.0 -6.132.146.195 -12.173.48.0 -12.173.60.0 -12.173.194.0 -12.173.196.0 -12.173.209.0 -12.173.227.0 -12.173.235.0 -12.174.34.0 -12.174.36.0 -12.174.87.0 -12.174.210.0 -12.174.224.0 -12.175.40.0 -12.175.48.0 -12.175.115.0 -12.175.224.0 -12.176.100.0 -48.124.146.106 -12.176.228.0 -12.177.20.0 -12.177.32.0 -12.177.68.0 -12.178.96.0 -12.178.144.0 -12.179.117.0 -12.179.128.0 -12.180.104.0 -12.180.240.0 -12.180.242.0 -12.181.64.0 -12.194.239.0 -12.194.240.0 -12.223.2.0 -12.223.4.0 -12.223.6.0 -12.232.104.221 -12.242.16.0 +13.8.128.0 +12.242.18.0 +12.242.17.0 +12.242.17.0 12.242.17.0 12.242.18.0 13.0.0.0