-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprimate_bit.h
8251 lines (8233 loc) · 207 KB
/
primate_bit.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#ifndef PRIMATE_BIT_H
#define PRIMATE_BIT_H
/*
* custom width types
*/
namespace Primate {
/* templates */
//template<typename... T>
//constexpr auto Sum(T... t) {
// return (t + ...);
//}
//template<int T, int... U>
//struct SInt {
// using type = _ExtInt(Sum(T, U...));
//};
//template<int T, int... U>
//using SIntT = typename SInt<T, U...>::type;
template<int T>
using SInt = _ExtInt(T);
//template<int T, int... U>
//struct UInt {
// using type = unsigned _ExtInt(Sum(T, U...));
//};
//template<int T, int... U>
//using UIntT = typename UInt<T, U...>::type;
template<int T>
using UInt = unsigned _ExtInt(T);
/* concepts */
//template<typename T, typename... U>
//concept AnyOf = (std::same_as<T, U> || ...);
template<typename T> struct is_extintegral : std::false_type {};
template<int N> struct is_extintegral<SInt<N>> : std::true_type {};
template<int N> struct is_extintegral<UInt<N>> : std::true_type {};
template<typename T> inline constexpr bool is_extintegral_v = is_extintegral<T>::value;
template<typename T>
concept ExtIntegral = is_extintegral_v<T>;
/* aliases */
// signed
//using i1 = int<1>;
using i2 = SInt<2>;
using i3 = SInt<3>;
using i4 = SInt<4>;
using i5 = SInt<5>;
using i6 = SInt<6>;
using i7 = SInt<7>;
using i8 = SInt<8>;
using i9 = SInt<9>;
using i10 = SInt<10>;
using i11 = SInt<11>;
using i12 = SInt<12>;
using i13 = SInt<13>;
using i14 = SInt<14>;
using i15 = SInt<15>;
using i16 = SInt<16>;
using i17 = SInt<17>;
using i18 = SInt<18>;
using i19 = SInt<19>;
using i20 = SInt<20>;
using i21 = SInt<21>;
using i22 = SInt<22>;
using i23 = SInt<23>;
using i24 = SInt<24>;
using i25 = SInt<25>;
using i26 = SInt<26>;
using i27 = SInt<27>;
using i28 = SInt<28>;
using i29 = SInt<29>;
using i30 = SInt<30>;
using i31 = SInt<31>;
using i32 = SInt<32>;
using i33 = SInt<33>;
using i34 = SInt<34>;
using i35 = SInt<35>;
using i36 = SInt<36>;
using i37 = SInt<37>;
using i38 = SInt<38>;
using i39 = SInt<39>;
using i40 = SInt<40>;
using i41 = SInt<41>;
using i42 = SInt<42>;
using i43 = SInt<43>;
using i44 = SInt<44>;
using i45 = SInt<45>;
using i46 = SInt<46>;
using i47 = SInt<47>;
using i48 = SInt<48>;
using i49 = SInt<49>;
using i50 = SInt<50>;
using i51 = SInt<51>;
using i52 = SInt<52>;
using i53 = SInt<53>;
using i54 = SInt<54>;
using i55 = SInt<55>;
using i56 = SInt<56>;
using i57 = SInt<57>;
using i58 = SInt<58>;
using i59 = SInt<59>;
using i60 = SInt<60>;
using i61 = SInt<61>;
using i62 = SInt<62>;
using i63 = SInt<63>;
using i64 = SInt<64>;
using i65 = SInt<65>;
using i66 = SInt<66>;
using i67 = SInt<67>;
using i68 = SInt<68>;
using i69 = SInt<69>;
using i70 = SInt<70>;
using i71 = SInt<71>;
using i72 = SInt<72>;
using i73 = SInt<73>;
using i74 = SInt<74>;
using i75 = SInt<75>;
using i76 = SInt<76>;
using i77 = SInt<77>;
using i78 = SInt<78>;
using i79 = SInt<79>;
using i80 = SInt<80>;
using i81 = SInt<81>;
using i82 = SInt<82>;
using i83 = SInt<83>;
using i84 = SInt<84>;
using i85 = SInt<85>;
using i86 = SInt<86>;
using i87 = SInt<87>;
using i88 = SInt<88>;
using i89 = SInt<89>;
using i90 = SInt<90>;
using i91 = SInt<91>;
using i92 = SInt<92>;
using i93 = SInt<93>;
using i94 = SInt<94>;
using i95 = SInt<95>;
using i96 = SInt<96>;
using i97 = SInt<97>;
using i98 = SInt<98>;
using i99 = SInt<99>;
using i100 = SInt<100>;
using i101 = SInt<101>;
using i102 = SInt<102>;
using i103 = SInt<103>;
using i104 = SInt<104>;
using i105 = SInt<105>;
using i106 = SInt<106>;
using i107 = SInt<107>;
using i108 = SInt<108>;
using i109 = SInt<109>;
using i110 = SInt<110>;
using i111 = SInt<111>;
using i112 = SInt<112>;
using i113 = SInt<113>;
using i114 = SInt<114>;
using i115 = SInt<115>;
using i116 = SInt<116>;
using i117 = SInt<117>;
using i118 = SInt<118>;
using i119 = SInt<119>;
using i120 = SInt<120>;
using i121 = SInt<121>;
using i122 = SInt<122>;
using i123 = SInt<123>;
using i124 = SInt<124>;
using i125 = SInt<125>;
using i126 = SInt<126>;
using i127 = SInt<127>;
using i128 = SInt<128>;
using i129 = SInt<129>;
using i130 = SInt<130>;
using i131 = SInt<131>;
using i132 = SInt<132>;
using i133 = SInt<133>;
using i134 = SInt<134>;
using i135 = SInt<135>;
using i136 = SInt<136>;
using i137 = SInt<137>;
using i138 = SInt<138>;
using i139 = SInt<139>;
using i140 = SInt<140>;
using i141 = SInt<141>;
using i142 = SInt<142>;
using i143 = SInt<143>;
using i144 = SInt<144>;
using i145 = SInt<145>;
using i146 = SInt<146>;
using i147 = SInt<147>;
using i148 = SInt<148>;
using i149 = SInt<149>;
using i150 = SInt<150>;
using i151 = SInt<151>;
using i152 = SInt<152>;
using i153 = SInt<153>;
using i154 = SInt<154>;
using i155 = SInt<155>;
using i156 = SInt<156>;
using i157 = SInt<157>;
using i158 = SInt<158>;
using i159 = SInt<159>;
using i160 = SInt<160>;
using i161 = SInt<161>;
using i162 = SInt<162>;
using i163 = SInt<163>;
using i164 = SInt<164>;
using i165 = SInt<165>;
using i166 = SInt<166>;
using i167 = SInt<167>;
using i168 = SInt<168>;
using i169 = SInt<169>;
using i170 = SInt<170>;
using i171 = SInt<171>;
using i172 = SInt<172>;
using i173 = SInt<173>;
using i174 = SInt<174>;
using i175 = SInt<175>;
using i176 = SInt<176>;
using i177 = SInt<177>;
using i178 = SInt<178>;
using i179 = SInt<179>;
using i180 = SInt<180>;
using i181 = SInt<181>;
using i182 = SInt<182>;
using i183 = SInt<183>;
using i184 = SInt<184>;
using i185 = SInt<185>;
using i186 = SInt<186>;
using i187 = SInt<187>;
using i188 = SInt<188>;
using i189 = SInt<189>;
using i190 = SInt<190>;
using i191 = SInt<191>;
using i192 = SInt<192>;
using i193 = SInt<193>;
using i194 = SInt<194>;
using i195 = SInt<195>;
using i196 = SInt<196>;
using i197 = SInt<197>;
using i198 = SInt<198>;
using i199 = SInt<199>;
using i200 = SInt<200>;
using i201 = SInt<201>;
using i202 = SInt<202>;
using i203 = SInt<203>;
using i204 = SInt<204>;
using i205 = SInt<205>;
using i206 = SInt<206>;
using i207 = SInt<207>;
using i208 = SInt<208>;
using i209 = SInt<209>;
using i210 = SInt<210>;
using i211 = SInt<211>;
using i212 = SInt<212>;
using i213 = SInt<213>;
using i214 = SInt<214>;
using i215 = SInt<215>;
using i216 = SInt<216>;
using i217 = SInt<217>;
using i218 = SInt<218>;
using i219 = SInt<219>;
using i220 = SInt<220>;
using i221 = SInt<221>;
using i222 = SInt<222>;
using i223 = SInt<223>;
using i224 = SInt<224>;
using i225 = SInt<225>;
using i226 = SInt<226>;
using i227 = SInt<227>;
using i228 = SInt<228>;
using i229 = SInt<229>;
using i230 = SInt<230>;
using i231 = SInt<231>;
using i232 = SInt<232>;
using i233 = SInt<233>;
using i234 = SInt<234>;
using i235 = SInt<235>;
using i236 = SInt<236>;
using i237 = SInt<237>;
using i238 = SInt<238>;
using i239 = SInt<239>;
using i240 = SInt<240>;
using i241 = SInt<241>;
using i242 = SInt<242>;
using i243 = SInt<243>;
using i244 = SInt<244>;
using i245 = SInt<245>;
using i246 = SInt<246>;
using i247 = SInt<247>;
using i248 = SInt<248>;
using i249 = SInt<249>;
using i250 = SInt<250>;
using i251 = SInt<251>;
using i252 = SInt<252>;
using i253 = SInt<253>;
using i254 = SInt<254>;
using i255 = SInt<255>;
using i256 = SInt<256>;
using i257 = SInt<257>;
using i258 = SInt<258>;
using i259 = SInt<259>;
using i260 = SInt<260>;
using i261 = SInt<261>;
using i262 = SInt<262>;
using i263 = SInt<263>;
using i264 = SInt<264>;
using i265 = SInt<265>;
using i266 = SInt<266>;
using i267 = SInt<267>;
using i268 = SInt<268>;
using i269 = SInt<269>;
using i270 = SInt<270>;
using i271 = SInt<271>;
using i272 = SInt<272>;
using i273 = SInt<273>;
using i274 = SInt<274>;
using i275 = SInt<275>;
using i276 = SInt<276>;
using i277 = SInt<277>;
using i278 = SInt<278>;
using i279 = SInt<279>;
using i280 = SInt<280>;
using i281 = SInt<281>;
using i282 = SInt<282>;
using i283 = SInt<283>;
using i284 = SInt<284>;
using i285 = SInt<285>;
using i286 = SInt<286>;
using i287 = SInt<287>;
using i288 = SInt<288>;
using i289 = SInt<289>;
using i290 = SInt<290>;
using i291 = SInt<291>;
using i292 = SInt<292>;
using i293 = SInt<293>;
using i294 = SInt<294>;
using i295 = SInt<295>;
using i296 = SInt<296>;
using i297 = SInt<297>;
using i298 = SInt<298>;
using i299 = SInt<299>;
using i300 = SInt<300>;
using i301 = SInt<301>;
using i302 = SInt<302>;
using i303 = SInt<303>;
using i304 = SInt<304>;
using i305 = SInt<305>;
using i306 = SInt<306>;
using i307 = SInt<307>;
using i308 = SInt<308>;
using i309 = SInt<309>;
using i310 = SInt<310>;
using i311 = SInt<311>;
using i312 = SInt<312>;
using i313 = SInt<313>;
using i314 = SInt<314>;
using i315 = SInt<315>;
using i316 = SInt<316>;
using i317 = SInt<317>;
using i318 = SInt<318>;
using i319 = SInt<319>;
using i320 = SInt<320>;
using i321 = SInt<321>;
using i322 = SInt<322>;
using i323 = SInt<323>;
using i324 = SInt<324>;
using i325 = SInt<325>;
using i326 = SInt<326>;
using i327 = SInt<327>;
using i328 = SInt<328>;
using i329 = SInt<329>;
using i330 = SInt<330>;
using i331 = SInt<331>;
using i332 = SInt<332>;
using i333 = SInt<333>;
using i334 = SInt<334>;
using i335 = SInt<335>;
using i336 = SInt<336>;
using i337 = SInt<337>;
using i338 = SInt<338>;
using i339 = SInt<339>;
using i340 = SInt<340>;
using i341 = SInt<341>;
using i342 = SInt<342>;
using i343 = SInt<343>;
using i344 = SInt<344>;
using i345 = SInt<345>;
using i346 = SInt<346>;
using i347 = SInt<347>;
using i348 = SInt<348>;
using i349 = SInt<349>;
using i350 = SInt<350>;
using i351 = SInt<351>;
using i352 = SInt<352>;
using i353 = SInt<353>;
using i354 = SInt<354>;
using i355 = SInt<355>;
using i356 = SInt<356>;
using i357 = SInt<357>;
using i358 = SInt<358>;
using i359 = SInt<359>;
using i360 = SInt<360>;
using i361 = SInt<361>;
using i362 = SInt<362>;
using i363 = SInt<363>;
using i364 = SInt<364>;
using i365 = SInt<365>;
using i366 = SInt<366>;
using i367 = SInt<367>;
using i368 = SInt<368>;
using i369 = SInt<369>;
using i370 = SInt<370>;
using i371 = SInt<371>;
using i372 = SInt<372>;
using i373 = SInt<373>;
using i374 = SInt<374>;
using i375 = SInt<375>;
using i376 = SInt<376>;
using i377 = SInt<377>;
using i378 = SInt<378>;
using i379 = SInt<379>;
using i380 = SInt<380>;
using i381 = SInt<381>;
using i382 = SInt<382>;
using i383 = SInt<383>;
using i384 = SInt<384>;
using i385 = SInt<385>;
using i386 = SInt<386>;
using i387 = SInt<387>;
using i388 = SInt<388>;
using i389 = SInt<389>;
using i390 = SInt<390>;
using i391 = SInt<391>;
using i392 = SInt<392>;
using i393 = SInt<393>;
using i394 = SInt<394>;
using i395 = SInt<395>;
using i396 = SInt<396>;
using i397 = SInt<397>;
using i398 = SInt<398>;
using i399 = SInt<399>;
using i400 = SInt<400>;
using i401 = SInt<401>;
using i402 = SInt<402>;
using i403 = SInt<403>;
using i404 = SInt<404>;
using i405 = SInt<405>;
using i406 = SInt<406>;
using i407 = SInt<407>;
using i408 = SInt<408>;
using i409 = SInt<409>;
using i410 = SInt<410>;
using i411 = SInt<411>;
using i412 = SInt<412>;
using i413 = SInt<413>;
using i414 = SInt<414>;
using i415 = SInt<415>;
using i416 = SInt<416>;
using i417 = SInt<417>;
using i418 = SInt<418>;
using i419 = SInt<419>;
using i420 = SInt<420>;
using i421 = SInt<421>;
using i422 = SInt<422>;
using i423 = SInt<423>;
using i424 = SInt<424>;
using i425 = SInt<425>;
using i426 = SInt<426>;
using i427 = SInt<427>;
using i428 = SInt<428>;
using i429 = SInt<429>;
using i430 = SInt<430>;
using i431 = SInt<431>;
using i432 = SInt<432>;
using i433 = SInt<433>;
using i434 = SInt<434>;
using i435 = SInt<435>;
using i436 = SInt<436>;
using i437 = SInt<437>;
using i438 = SInt<438>;
using i439 = SInt<439>;
using i440 = SInt<440>;
using i441 = SInt<441>;
using i442 = SInt<442>;
using i443 = SInt<443>;
using i444 = SInt<444>;
using i445 = SInt<445>;
using i446 = SInt<446>;
using i447 = SInt<447>;
using i448 = SInt<448>;
using i449 = SInt<449>;
using i450 = SInt<450>;
using i451 = SInt<451>;
using i452 = SInt<452>;
using i453 = SInt<453>;
using i454 = SInt<454>;
using i455 = SInt<455>;
using i456 = SInt<456>;
using i457 = SInt<457>;
using i458 = SInt<458>;
using i459 = SInt<459>;
using i460 = SInt<460>;
using i461 = SInt<461>;
using i462 = SInt<462>;
using i463 = SInt<463>;
using i464 = SInt<464>;
using i465 = SInt<465>;
using i466 = SInt<466>;
using i467 = SInt<467>;
using i468 = SInt<468>;
using i469 = SInt<469>;
using i470 = SInt<470>;
using i471 = SInt<471>;
using i472 = SInt<472>;
using i473 = SInt<473>;
using i474 = SInt<474>;
using i475 = SInt<475>;
using i476 = SInt<476>;
using i477 = SInt<477>;
using i478 = SInt<478>;
using i479 = SInt<479>;
using i480 = SInt<480>;
using i481 = SInt<481>;
using i482 = SInt<482>;
using i483 = SInt<483>;
using i484 = SInt<484>;
using i485 = SInt<485>;
using i486 = SInt<486>;
using i487 = SInt<487>;
using i488 = SInt<488>;
using i489 = SInt<489>;
using i490 = SInt<490>;
using i491 = SInt<491>;
using i492 = SInt<492>;
using i493 = SInt<493>;
using i494 = SInt<494>;
using i495 = SInt<495>;
using i496 = SInt<496>;
using i497 = SInt<497>;
using i498 = SInt<498>;
using i499 = SInt<499>;
using i500 = SInt<500>;
using i501 = SInt<501>;
using i502 = SInt<502>;
using i503 = SInt<503>;
using i504 = SInt<504>;
using i505 = SInt<505>;
using i506 = SInt<506>;
using i507 = SInt<507>;
using i508 = SInt<508>;
using i509 = SInt<509>;
using i510 = SInt<510>;
using i511 = SInt<511>;
using i512 = SInt<512>;
using i513 = SInt<513>;
using i514 = SInt<514>;
using i515 = SInt<515>;
using i516 = SInt<516>;
using i517 = SInt<517>;
using i518 = SInt<518>;
using i519 = SInt<519>;
using i520 = SInt<520>;
using i521 = SInt<521>;
using i522 = SInt<522>;
using i523 = SInt<523>;
using i524 = SInt<524>;
using i525 = SInt<525>;
using i526 = SInt<526>;
using i527 = SInt<527>;
using i528 = SInt<528>;
using i529 = SInt<529>;
using i530 = SInt<530>;
using i531 = SInt<531>;
using i532 = SInt<532>;
using i533 = SInt<533>;
using i534 = SInt<534>;
using i535 = SInt<535>;
using i536 = SInt<536>;
using i537 = SInt<537>;
using i538 = SInt<538>;
using i539 = SInt<539>;
using i540 = SInt<540>;
using i541 = SInt<541>;
using i542 = SInt<542>;
using i543 = SInt<543>;
using i544 = SInt<544>;
using i545 = SInt<545>;
using i546 = SInt<546>;
using i547 = SInt<547>;
using i548 = SInt<548>;
using i549 = SInt<549>;
using i550 = SInt<550>;
using i551 = SInt<551>;
using i552 = SInt<552>;
using i553 = SInt<553>;
using i554 = SInt<554>;
using i555 = SInt<555>;
using i556 = SInt<556>;
using i557 = SInt<557>;
using i558 = SInt<558>;
using i559 = SInt<559>;
using i560 = SInt<560>;
using i561 = SInt<561>;
using i562 = SInt<562>;
using i563 = SInt<563>;
using i564 = SInt<564>;
using i565 = SInt<565>;
using i566 = SInt<566>;
using i567 = SInt<567>;
using i568 = SInt<568>;
using i569 = SInt<569>;
using i570 = SInt<570>;
using i571 = SInt<571>;
using i572 = SInt<572>;
using i573 = SInt<573>;
using i574 = SInt<574>;
using i575 = SInt<575>;
using i576 = SInt<576>;
using i577 = SInt<577>;
using i578 = SInt<578>;
using i579 = SInt<579>;
using i580 = SInt<580>;
using i581 = SInt<581>;
using i582 = SInt<582>;
using i583 = SInt<583>;
using i584 = SInt<584>;
using i585 = SInt<585>;
using i586 = SInt<586>;
using i587 = SInt<587>;
using i588 = SInt<588>;
using i589 = SInt<589>;
using i590 = SInt<590>;
using i591 = SInt<591>;
using i592 = SInt<592>;
using i593 = SInt<593>;
using i594 = SInt<594>;
using i595 = SInt<595>;
using i596 = SInt<596>;
using i597 = SInt<597>;
using i598 = SInt<598>;
using i599 = SInt<599>;
using i600 = SInt<600>;
using i601 = SInt<601>;
using i602 = SInt<602>;
using i603 = SInt<603>;
using i604 = SInt<604>;
using i605 = SInt<605>;
using i606 = SInt<606>;
using i607 = SInt<607>;
using i608 = SInt<608>;
using i609 = SInt<609>;
using i610 = SInt<610>;
using i611 = SInt<611>;
using i612 = SInt<612>;
using i613 = SInt<613>;
using i614 = SInt<614>;
using i615 = SInt<615>;
using i616 = SInt<616>;
using i617 = SInt<617>;
using i618 = SInt<618>;
using i619 = SInt<619>;
using i620 = SInt<620>;
using i621 = SInt<621>;
using i622 = SInt<622>;
using i623 = SInt<623>;
using i624 = SInt<624>;
using i625 = SInt<625>;
using i626 = SInt<626>;
using i627 = SInt<627>;
using i628 = SInt<628>;
using i629 = SInt<629>;
using i630 = SInt<630>;
using i631 = SInt<631>;
using i632 = SInt<632>;
using i633 = SInt<633>;
using i634 = SInt<634>;
using i635 = SInt<635>;
using i636 = SInt<636>;
using i637 = SInt<637>;
using i638 = SInt<638>;
using i639 = SInt<639>;
using i640 = SInt<640>;
using i641 = SInt<641>;
using i642 = SInt<642>;
using i643 = SInt<643>;
using i644 = SInt<644>;
using i645 = SInt<645>;
using i646 = SInt<646>;
using i647 = SInt<647>;
using i648 = SInt<648>;
using i649 = SInt<649>;
using i650 = SInt<650>;
using i651 = SInt<651>;
using i652 = SInt<652>;
using i653 = SInt<653>;
using i654 = SInt<654>;
using i655 = SInt<655>;
using i656 = SInt<656>;
using i657 = SInt<657>;
using i658 = SInt<658>;
using i659 = SInt<659>;
using i660 = SInt<660>;
using i661 = SInt<661>;
using i662 = SInt<662>;
using i663 = SInt<663>;
using i664 = SInt<664>;
using i665 = SInt<665>;
using i666 = SInt<666>;
using i667 = SInt<667>;
using i668 = SInt<668>;
using i669 = SInt<669>;
using i670 = SInt<670>;
using i671 = SInt<671>;
using i672 = SInt<672>;
using i673 = SInt<673>;
using i674 = SInt<674>;
using i675 = SInt<675>;
using i676 = SInt<676>;
using i677 = SInt<677>;
using i678 = SInt<678>;
using i679 = SInt<679>;
using i680 = SInt<680>;
using i681 = SInt<681>;
using i682 = SInt<682>;
using i683 = SInt<683>;
using i684 = SInt<684>;
using i685 = SInt<685>;
using i686 = SInt<686>;
using i687 = SInt<687>;
using i688 = SInt<688>;
using i689 = SInt<689>;
using i690 = SInt<690>;
using i691 = SInt<691>;
using i692 = SInt<692>;
using i693 = SInt<693>;
using i694 = SInt<694>;
using i695 = SInt<695>;
using i696 = SInt<696>;
using i697 = SInt<697>;
using i698 = SInt<698>;
using i699 = SInt<699>;
using i700 = SInt<700>;
using i701 = SInt<701>;
using i702 = SInt<702>;
using i703 = SInt<703>;
using i704 = SInt<704>;
using i705 = SInt<705>;
using i706 = SInt<706>;
using i707 = SInt<707>;
using i708 = SInt<708>;
using i709 = SInt<709>;
using i710 = SInt<710>;
using i711 = SInt<711>;
using i712 = SInt<712>;
using i713 = SInt<713>;
using i714 = SInt<714>;
using i715 = SInt<715>;
using i716 = SInt<716>;
using i717 = SInt<717>;
using i718 = SInt<718>;
using i719 = SInt<719>;
using i720 = SInt<720>;
using i721 = SInt<721>;
using i722 = SInt<722>;
using i723 = SInt<723>;
using i724 = SInt<724>;
using i725 = SInt<725>;
using i726 = SInt<726>;
using i727 = SInt<727>;
using i728 = SInt<728>;
using i729 = SInt<729>;
using i730 = SInt<730>;
using i731 = SInt<731>;
using i732 = SInt<732>;
using i733 = SInt<733>;
using i734 = SInt<734>;
using i735 = SInt<735>;
using i736 = SInt<736>;
using i737 = SInt<737>;
using i738 = SInt<738>;
using i739 = SInt<739>;
using i740 = SInt<740>;
using i741 = SInt<741>;
using i742 = SInt<742>;
using i743 = SInt<743>;
using i744 = SInt<744>;
using i745 = SInt<745>;
using i746 = SInt<746>;
using i747 = SInt<747>;
using i748 = SInt<748>;
using i749 = SInt<749>;
using i750 = SInt<750>;
using i751 = SInt<751>;
using i752 = SInt<752>;
using i753 = SInt<753>;
using i754 = SInt<754>;
using i755 = SInt<755>;
using i756 = SInt<756>;
using i757 = SInt<757>;
using i758 = SInt<758>;
using i759 = SInt<759>;
using i760 = SInt<760>;
using i761 = SInt<761>;
using i762 = SInt<762>;
using i763 = SInt<763>;
using i764 = SInt<764>;
using i765 = SInt<765>;
using i766 = SInt<766>;
using i767 = SInt<767>;
using i768 = SInt<768>;
using i769 = SInt<769>;
using i770 = SInt<770>;
using i771 = SInt<771>;
using i772 = SInt<772>;
using i773 = SInt<773>;
using i774 = SInt<774>;
using i775 = SInt<775>;
using i776 = SInt<776>;
using i777 = SInt<777>;
using i778 = SInt<778>;
using i779 = SInt<779>;
using i780 = SInt<780>;
using i781 = SInt<781>;
using i782 = SInt<782>;
using i783 = SInt<783>;
using i784 = SInt<784>;
using i785 = SInt<785>;
using i786 = SInt<786>;
using i787 = SInt<787>;
using i788 = SInt<788>;
using i789 = SInt<789>;
using i790 = SInt<790>;
using i791 = SInt<791>;
using i792 = SInt<792>;
using i793 = SInt<793>;
using i794 = SInt<794>;
using i795 = SInt<795>;
using i796 = SInt<796>;
using i797 = SInt<797>;
using i798 = SInt<798>;
using i799 = SInt<799>;
using i800 = SInt<800>;
using i801 = SInt<801>;
using i802 = SInt<802>;
using i803 = SInt<803>;
using i804 = SInt<804>;
using i805 = SInt<805>;
using i806 = SInt<806>;
using i807 = SInt<807>;
using i808 = SInt<808>;
using i809 = SInt<809>;
using i810 = SInt<810>;
using i811 = SInt<811>;
using i812 = SInt<812>;
using i813 = SInt<813>;
using i814 = SInt<814>;
using i815 = SInt<815>;
using i816 = SInt<816>;
using i817 = SInt<817>;
using i818 = SInt<818>;
using i819 = SInt<819>;
using i820 = SInt<820>;
using i821 = SInt<821>;
using i822 = SInt<822>;
using i823 = SInt<823>;
using i824 = SInt<824>;
using i825 = SInt<825>;
using i826 = SInt<826>;
using i827 = SInt<827>;
using i828 = SInt<828>;
using i829 = SInt<829>;
using i830 = SInt<830>;
using i831 = SInt<831>;
using i832 = SInt<832>;
using i833 = SInt<833>;
using i834 = SInt<834>;
using i835 = SInt<835>;
using i836 = SInt<836>;
using i837 = SInt<837>;
using i838 = SInt<838>;
using i839 = SInt<839>;
using i840 = SInt<840>;
using i841 = SInt<841>;
using i842 = SInt<842>;
using i843 = SInt<843>;
using i844 = SInt<844>;
using i845 = SInt<845>;
using i846 = SInt<846>;
using i847 = SInt<847>;
using i848 = SInt<848>;
using i849 = SInt<849>;
using i850 = SInt<850>;
using i851 = SInt<851>;
using i852 = SInt<852>;
using i853 = SInt<853>;
using i854 = SInt<854>;
using i855 = SInt<855>;
using i856 = SInt<856>;
using i857 = SInt<857>;
using i858 = SInt<858>;
using i859 = SInt<859>;
using i860 = SInt<860>;
using i861 = SInt<861>;
using i862 = SInt<862>;
using i863 = SInt<863>;
using i864 = SInt<864>;
using i865 = SInt<865>;
using i866 = SInt<866>;
using i867 = SInt<867>;
using i868 = SInt<868>;
using i869 = SInt<869>;
using i870 = SInt<870>;
using i871 = SInt<871>;
using i872 = SInt<872>;
using i873 = SInt<873>;
using i874 = SInt<874>;
using i875 = SInt<875>;
using i876 = SInt<876>;
using i877 = SInt<877>;
using i878 = SInt<878>;
using i879 = SInt<879>;
using i880 = SInt<880>;
using i881 = SInt<881>;
using i882 = SInt<882>;
using i883 = SInt<883>;
using i884 = SInt<884>;
using i885 = SInt<885>;
using i886 = SInt<886>;
using i887 = SInt<887>;
using i888 = SInt<888>;
using i889 = SInt<889>;
using i890 = SInt<890>;
using i891 = SInt<891>;
using i892 = SInt<892>;
using i893 = SInt<893>;
using i894 = SInt<894>;
using i895 = SInt<895>;
using i896 = SInt<896>;
using i897 = SInt<897>;
using i898 = SInt<898>;
using i899 = SInt<899>;
using i900 = SInt<900>;
using i901 = SInt<901>;
using i902 = SInt<902>;
using i903 = SInt<903>;
using i904 = SInt<904>;
using i905 = SInt<905>;
using i906 = SInt<906>;
using i907 = SInt<907>;
using i908 = SInt<908>;
using i909 = SInt<909>;
using i910 = SInt<910>;
using i911 = SInt<911>;
using i912 = SInt<912>;
using i913 = SInt<913>;
using i914 = SInt<914>;
using i915 = SInt<915>;
using i916 = SInt<916>;
using i917 = SInt<917>;
using i918 = SInt<918>;
using i919 = SInt<919>;
using i920 = SInt<920>;
using i921 = SInt<921>;
using i922 = SInt<922>;
using i923 = SInt<923>;
using i924 = SInt<924>;
using i925 = SInt<925>;
using i926 = SInt<926>;
using i927 = SInt<927>;
using i928 = SInt<928>;
using i929 = SInt<929>;
using i930 = SInt<930>;
using i931 = SInt<931>;
using i932 = SInt<932>;
using i933 = SInt<933>;
using i934 = SInt<934>;
using i935 = SInt<935>;
using i936 = SInt<936>;
using i937 = SInt<937>;
using i938 = SInt<938>;
using i939 = SInt<939>;
using i940 = SInt<940>;
using i941 = SInt<941>;
using i942 = SInt<942>;
using i943 = SInt<943>;
using i944 = SInt<944>;
using i945 = SInt<945>;
using i946 = SInt<946>;
using i947 = SInt<947>;
using i948 = SInt<948>;