cython

Форк
0
/
pyintop.pyx 
691 строка · 18.1 Кб
1
# cython: language_level=3str
2
# mode: run
3

4
cimport cython
5

6

7
def bigint(x):
8
    # avoid 'L' postfix in Py2.x
9
    print(str(x).rstrip('L'))
10

11
def bigints(x):
12
    # avoid 'L' postfix in Py2.x
13
    print(str(x).replace('L', ''))
14

15

16
@cython.test_assert_path_exists('//IntBinopNode')
17
def or_obj(obj2, obj3):
18
    """
19
    >>> or_obj(2, 3)
20
    3
21
    """
22
    obj1 = obj2 | obj3
23
    return obj1
24

25

26
@cython.test_fail_if_path_exists('//IntBinopNode')
27
def or_int(obj2):
28
    """
29
    >>> or_int(0)
30
    16
31
    >>> or_int(1)
32
    17
33
    >>> or_int(16)
34
    16
35
    """
36
    obj1 = obj2 | 0x10
37
    return obj1
38

39

40
@cython.test_assert_path_exists('//IntBinopNode')
41
def xor_obj(obj2, obj3):
42
    """
43
    >>> xor_obj(2, 3)
44
    1
45
    """
46
    obj1 = obj2 ^ obj3
47
    return obj1
48

49

50
@cython.test_fail_if_path_exists('//IntBinopNode')
51
def xor_int(obj2):
52
    """
53
    >>> xor_int(0)
54
    16
55
    >>> xor_int(2)
56
    18
57
    >>> xor_int(16)
58
    0
59
    """
60
    obj1 = obj2 ^ 0x10
61
    return obj1
62

63

64
@cython.test_assert_path_exists('//IntBinopNode')
65
def and_obj(obj2, obj3):
66
    """
67
    >>> and_obj(2, 3)
68
    2
69
    """
70
    obj1 = obj2 & obj3
71
    return obj1
72

73

74
@cython.test_fail_if_path_exists('//IntBinopNode')
75
def and_int(obj2):
76
    """
77
    >>> and_int(0)
78
    0
79
    >>> and_int(1)
80
    0
81
    >>> and_int(18)
82
    16
83
    >>> and_int(-1)
84
    16
85
    """
86
    obj1 = obj2 & 0x10
87
    return obj1
88

89

90
@cython.test_assert_path_exists('//IntBinopNode')
91
def lshift_obj(obj2, obj3):
92
    """
93
    >>> lshift_obj(2, 3)
94
    16
95
    """
96
    obj1 = obj2 << obj3
97
    return obj1
98

99

100
@cython.test_assert_path_exists('//IntBinopNode')
101
def rshift_obj(obj2, obj3):
102
    """
103
    >>> rshift_obj(2, 3)
104
    0
105
    """
106
    obj1 = obj2 >> obj3
107
    return obj1
108

109

110
@cython.test_assert_path_exists('//IntBinopNode')
111
def rshift_int_obj(obj3):
112
    """
113
    >>> rshift_int_obj(3)
114
    0
115
    >>> rshift_int_obj(2)
116
    0
117
    >>> rshift_int_obj(1)
118
    1
119
    >>> rshift_int_obj(0)
120
    2
121
    >>> rshift_int_obj(-1)
122
    Traceback (most recent call last):
123
    ValueError: negative shift count
124
    """
125
    obj1 = 2 >> obj3
126
    return obj1
127

128

129
@cython.test_fail_if_path_exists('//IntBinopNode')
130
def rshift_int(obj2):
131
    """
132
    >>> rshift_int(0)
133
    0
134
    >>> rshift_int(2)
135
    0
136

137
    >>> rshift_int(27)
138
    3
139
    >>> (-27) >> 3
140
    -4
141
    >>> rshift_int(-27)
142
    -4
143

144
    >>> rshift_int(32)
145
    4
146
    >>> (-32) >> 3
147
    -4
148
    >>> rshift_int(-32)
149
    -4
150

151
    >>> (2**28) >> 3
152
    33554432
153
    >>> rshift_int(2**28)
154
    33554432
155
    >>> (-2**28) >> 3
156
    -33554432
157
    >>> rshift_int(-2**28)
158
    -33554432
159

160
    >>> (2**30) >> 3
161
    134217728
162
    >>> rshift_int(2**30)
163
    134217728
164
    >>> rshift_int(-2**30)
165
    -134217728
166

167
    >>> bigint((2**60) >> 3)
168
    144115188075855872
169
    >>> bigint(rshift_int(2**60))
170
    144115188075855872
171
    >>> bigint(rshift_int(-2**60))
172
    -144115188075855872
173
    """
174
    obj1 = obj2 >> 3
175
    return obj1
176

177

178
@cython.test_assert_path_exists(
179
    '//SingleAssignmentNode//IntBinopNode',
180
    '//SingleAssignmentNode//PythonCapiCallNode',
181
)
182
def lshift_int(obj):
183
    """
184
    >>> lshift_int(0)
185
    (0, 0, 0, 0)
186
    >>> bigints(lshift_int(1))
187
    (8, 2147483648, 9223372036854775808, 10633823966279326983230456482242756608)
188
    >>> bigints(lshift_int(-1))
189
    (-8, -2147483648, -9223372036854775808, -10633823966279326983230456482242756608)
190
    >>> bigints(lshift_int(2))
191
    (16, 4294967296, 18446744073709551616, 21267647932558653966460912964485513216)
192

193
    >>> bigints(lshift_int(27))
194
    (216, 57982058496, 249031044995078946816, 287113247089541828547222325020554428416)
195
    >>> (-27) << 3
196
    -216
197
    >>> bigints(lshift_int(-27))
198
    (-216, -57982058496, -249031044995078946816, -287113247089541828547222325020554428416)
199

200
    >>> bigints(lshift_int(32))
201
    (256, 68719476736, 295147905179352825856, 340282366920938463463374607431768211456)
202
    >>> (-32) << 3
203
    -256
204
    >>> bigints(lshift_int(-32))
205
    (-256, -68719476736, -295147905179352825856, -340282366920938463463374607431768211456)
206

207
    >>> bigint((2**28) << 3)
208
    2147483648
209
    >>> bigints(lshift_int(2**28))
210
    (2147483648, 576460752303423488, 2475880078570760549798248448, 2854495385411919762116571938898990272765493248)
211
    >>> bigint((-2**28) << 3)
212
    -2147483648
213
    >>> bigints(lshift_int(-2**28))
214
    (-2147483648, -576460752303423488, -2475880078570760549798248448, -2854495385411919762116571938898990272765493248)
215

216
    >>> bigint((2**30) << 3)
217
    8589934592
218
    >>> bigints(lshift_int(2**30))
219
    (8589934592, 2305843009213693952, 9903520314283042199192993792, 11417981541647679048466287755595961091061972992)
220
    >>> bigints(lshift_int(-2**30))
221
    (-8589934592, -2305843009213693952, -9903520314283042199192993792, -11417981541647679048466287755595961091061972992)
222

223
    >>> bigint((2**60) << 3)
224
    9223372036854775808
225
    >>> bigints(lshift_int(2**60))
226
    (9223372036854775808, 2475880078570760549798248448, 10633823966279326983230456482242756608, 12259964326927110866866776217202473468949912977468817408)
227
    >>> bigints(lshift_int(-2**60))
228
    (-9223372036854775808, -2475880078570760549798248448, -10633823966279326983230456482242756608, -12259964326927110866866776217202473468949912977468817408)
229
    """
230
    r1 = obj << 3
231
    r2 = obj << 31
232
    r3 = obj << 63
233
    r4 = obj << 123
234
    return r1, r2, r3, r4
235

236

237
@cython.test_assert_path_exists(
238
    '//IntBinopNode',
239
    '//IntBinopNode//IntBinopNode',
240
)
241
def mixed_obj(obj2, obj3):
242
    """
243
    >>> mixed_obj(2, 3)
244
    16
245
    """
246
    obj1 = obj2 << obj3 | obj2 >> obj3
247
    return obj1
248

249

250
@cython.test_assert_path_exists(
251
    '//IntBinopNode',
252
    '//IntBinopNode//PythonCapiCallNode',
253
)
254
@cython.test_fail_if_path_exists(
255
    '//IntBinopNode//IntBinopNode',
256
)
257
def mixed_int(obj2):
258
    """
259
    >>> mixed_int(0)
260
    16
261
    >>> mixed_int(2)
262
    18
263
    >>> mixed_int(16)
264
    0
265
    >>> mixed_int(17)
266
    1
267
    """
268
    obj1 = (obj2 ^ 0x10) | (obj2 & 0x01)
269
    return obj1
270

271

272
@cython.test_assert_path_exists('//PythonCapiCallNode')
273
@cython.test_fail_if_path_exists(
274
    '//IntBinopNode',
275
    '//PrimaryCmpNode',
276
)
277
def equals(obj2):
278
    """
279
    >>> equals(2)
280
    True
281
    >>> equals(0)
282
    False
283
    >>> equals(-1)
284
    False
285
    """
286
    result = obj2 == 2
287
    return result
288

289

290
@cython.test_assert_path_exists('//PythonCapiCallNode')
291
@cython.test_fail_if_path_exists(
292
    '//IntBinopNode',
293
    '//PrimaryCmpNode',
294
)
295
def not_equals(obj2):
296
    """
297
    >>> not_equals(2)
298
    False
299
    >>> not_equals(0)
300
    True
301
    >>> not_equals(-1)
302
    True
303
    """
304
    result = obj2 != 2
305
    return result
306

307

308
@cython.test_assert_path_exists('//PythonCapiCallNode')
309
@cython.test_assert_path_exists('//PrimaryCmpNode')
310
def equals_many(obj2):
311
    """
312
    >>> equals_many(-2)
313
    (False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
314
    >>> equals_many(0)
315
    (True, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
316
    >>> equals_many(1)
317
    (False, True, False, False, False, False, False, False, False, False, False, False, False, False, False)
318
    >>> equals_many(-1)
319
    (False, False, True, False, False, False, False, False, False, False, False, False, False, False, False)
320
    >>> equals_many(2**30)
321
    (False, False, False, True, False, False, False, False, False, False, False, False, False, False, False)
322
    >>> equals_many(-2**30)
323
    (False, False, False, False, True, False, False, False, False, False, False, False, False, False, False)
324
    >>> equals_many(2**30-1)
325
    (False, False, False, False, False, True, False, False, False, False, False, False, False, False, False)
326
    >>> equals_many(-2**30+1)
327
    (False, False, False, False, False, False, True, False, False, False, False, False, False, False, False)
328
    >>> equals_many(2**32)
329
    (False, False, False, False, False, False, False, True, False, False, False, False, False, False, False)
330
    >>> equals_many(-2**32)
331
    (False, False, False, False, False, False, False, False, True, False, False, False, False, False, False)
332
    >>> equals_many(2**45-1)
333
    (False, False, False, False, False, False, False, False, False, True, False, False, False, False, False)
334
    >>> equals_many(-2**45+1)
335
    (False, False, False, False, False, False, False, False, False, False, True, False, False, False, False)
336
    >>> equals_many(2**64)
337
    (False, False, False, False, False, False, False, False, False, False, False, True, False, False, False)
338
    >>> equals_many(-2**64)
339
    (False, False, False, False, False, False, False, False, False, False, False, False, True, False, False)
340
    >>> equals_many(2**64-1)
341
    (False, False, False, False, False, False, False, False, False, False, False, False, False, True, False)
342
    >>> equals_many(-2**64+1)
343
    (False, False, False, False, False, False, False, False, False, False, False, False, False, False, True)
344
    """
345
    cdef bint x, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o
346
    a = obj2 == 0
347
    x = 0 == obj2
348
    assert a == x
349
    b = obj2 == 1
350
    x = 1 == obj2
351
    assert b == x
352
    c = obj2 == -1
353
    x = -1 == obj2
354
    assert c == x
355
    d = obj2 == 2**30
356
    x = 2**30 == obj2
357
    assert d == x
358
    e = obj2 == -2**30
359
    x = -2**30 == obj2
360
    assert e == x
361
    f = obj2 == 2**30-1
362
    x = 2**30-1 == obj2
363
    assert f == x
364
    g = obj2 == -2**30+1
365
    x = -2**30+1 == obj2
366
    assert g == x
367
    h = obj2 == 2**32
368
    x = 2**32 == obj2
369
    assert h == x
370
    i = obj2 == -2**32
371
    x = -2**32 == obj2
372
    assert i == x
373
    j = obj2 == 2**45-1
374
    x = 2**45-1 == obj2
375
    assert j == x
376
    k = obj2 == -2**45+1
377
    x = -2**45+1 == obj2
378
    assert k == x
379
    l = obj2 == 2**64
380
    x = 2**64 == obj2
381
    assert l == x
382
    m = obj2 == -2**64
383
    x = -2**64 == obj2
384
    assert m == x
385
    n = obj2 == 2**64-1
386
    x = 2**64-1 == obj2
387
    assert n == x
388
    o = obj2 == -2**64+1
389
    x = -2**64+1 == obj2
390
    assert o == x
391
    return (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
392

393

394
@cython.test_assert_path_exists('//PythonCapiCallNode')
395
@cython.test_assert_path_exists('//PrimaryCmpNode')
396
def not_equals_many(obj2):
397
    """
398
    >>> not_equals_many(-2)
399
    (False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
400
    >>> not_equals_many(0)
401
    (True, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
402
    >>> not_equals_many(1)
403
    (False, True, False, False, False, False, False, False, False, False, False, False, False, False, False)
404
    >>> not_equals_many(-1)
405
    (False, False, True, False, False, False, False, False, False, False, False, False, False, False, False)
406
    >>> not_equals_many(2**30)
407
    (False, False, False, True, False, False, False, False, False, False, False, False, False, False, False)
408
    >>> not_equals_many(-2**30)
409
    (False, False, False, False, True, False, False, False, False, False, False, False, False, False, False)
410
    >>> not_equals_many(2**30-1)
411
    (False, False, False, False, False, True, False, False, False, False, False, False, False, False, False)
412
    >>> not_equals_many(-2**30+1)
413
    (False, False, False, False, False, False, True, False, False, False, False, False, False, False, False)
414
    >>> not_equals_many(2**32)
415
    (False, False, False, False, False, False, False, True, False, False, False, False, False, False, False)
416
    >>> not_equals_many(-2**32)
417
    (False, False, False, False, False, False, False, False, True, False, False, False, False, False, False)
418
    >>> not_equals_many(2**45-1)
419
    (False, False, False, False, False, False, False, False, False, True, False, False, False, False, False)
420
    >>> not_equals_many(-2**45+1)
421
    (False, False, False, False, False, False, False, False, False, False, True, False, False, False, False)
422
    >>> not_equals_many(2**64)
423
    (False, False, False, False, False, False, False, False, False, False, False, True, False, False, False)
424
    >>> not_equals_many(-2**64)
425
    (False, False, False, False, False, False, False, False, False, False, False, False, True, False, False)
426
    >>> not_equals_many(2**64-1)
427
    (False, False, False, False, False, False, False, False, False, False, False, False, False, True, False)
428
    >>> not_equals_many(-2**64+1)
429
    (False, False, False, False, False, False, False, False, False, False, False, False, False, False, True)
430
    """
431
    cdef bint a, b, c, d, e, f, g, h, i, j, k, l, m, n, o
432
    a = obj2 != 0
433
    x = 0 != obj2
434
    assert a == x
435
    b = obj2 != 1
436
    x = 1 != obj2
437
    assert b == x
438
    c = obj2 != -1
439
    x = -1 != obj2
440
    assert c == x
441
    d = obj2 != 2**30
442
    x = 2**30 != obj2
443
    assert d == x
444
    e = obj2 != -2**30
445
    x = -2**30 != obj2
446
    assert e == x
447
    f = obj2 != 2**30-1
448
    x = 2**30-1 != obj2
449
    assert f == x
450
    g = obj2 != -2**30+1
451
    x = -2**30+1 != obj2
452
    assert g == x
453
    h = obj2 != 2**32
454
    x = 2**32 != obj2
455
    assert h == x
456
    i = obj2 != -2**32
457
    x = -2**32 != obj2
458
    assert i == x
459
    j = obj2 != 2**45-1
460
    x = 2**45-1 != obj2
461
    assert j == x
462
    k = obj2 != -2**45+1
463
    x = -2**45+1 != obj2
464
    assert k == x
465
    l = obj2 != 2**64
466
    x = 2**64 != obj2
467
    assert l == x
468
    m = obj2 != -2**64
469
    x = -2**64 != obj2
470
    assert m == x
471
    n = obj2 != 2**64-1
472
    x = 2**64-1 != obj2
473
    assert n == x
474
    o = obj2 != -2**64+1
475
    x = -2**64+1 != obj2
476
    assert o == x
477
    return tuple(not x for x in (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o))
478

479

480
@cython.test_assert_path_exists('//PythonCapiCallNode')
481
@cython.test_fail_if_path_exists(
482
    '//IntBinopNode',
483
    '//PrimaryCmpNode',
484
)
485
def equals_zero(obj2):
486
    """
487
    >>> equals_zero(2)
488
    False
489
    >>> equals_zero(0)
490
    True
491
    >>> equals_zero(-1)
492
    False
493
    """
494
    result = obj2 == 0
495
    return result
496

497

498
def truthy(obj2):
499
    """
500
    >>> truthy(2)
501
    True
502
    >>> truthy(0)
503
    False
504
    >>> truthy(-1)
505
    True
506
    """
507
    if obj2:
508
        return True
509
    else:
510
        return False
511

512
@cython.test_fail_if_path_exists("//CoerceToBooleanNode")
513
@cython.test_fail_if_path_exists("//CoerceToPyTypeNode")
514
def test_avoid_if_coercion(obj):
515
    if obj == 1:  # this should not go through a Python intermediate
516
        return True
517
    else:
518
        return False
519

520
@cython.test_fail_if_path_exists('//AddNode')
521
@cython.test_fail_if_path_exists('//NumBinopNode')
522
@cython.test_fail_if_path_exists('//BinopNode')
523
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
524
def pure_add_int(obj2: int):
525
    """
526
    >>> pure_add_int(1)
527
    (2, 2)
528
    """
529
    res1 = obj2 + 1
530
    res2 = 1 + obj2
531
    return res1, res2
532

533
@cython.test_fail_if_path_exists('//SubNode')
534
@cython.test_fail_if_path_exists('//NumBinopNode')
535
@cython.test_fail_if_path_exists('//BinopNode')
536
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
537
def pure_sub_int(obj2: int):
538
    """
539
    >>> pure_sub_int(1)
540
    (0, 0)
541
    """
542
    res1 = obj2 - 1
543
    res2 = 1 - obj2
544
    return res1, res2
545

546
@cython.test_fail_if_path_exists('//MulNode')
547
@cython.test_fail_if_path_exists('//NumBinopNode')
548
@cython.test_fail_if_path_exists('//BinopNode')
549
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
550
def pure_mul_int(obj2: int):
551
    """
552
    >>> pure_mul_int(2)
553
    (4, 4)
554
    """
555
    res1 = obj2 * 2
556
    res2 = 2 * obj2
557
    return res1, res2
558

559
@cython.test_fail_if_path_exists('//PrimaryCmpNode')
560
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
561
def pure_eq_int(obj2: int):
562
    """
563
    >>> pure_eq_int(2)
564
    (True, True)
565
    >>> pure_eq_int(3)
566
    (False, False)
567
    """
568
    res1 = obj2 == 2
569
    res2 = 2 == obj2
570
    return res1, res2
571

572
@cython.test_fail_if_path_exists('//PrimaryCmpNode')
573
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
574
def pure_ne_int(obj2: int):
575
    """
576
    >>> pure_ne_int(2)
577
    (False, False)
578
    >>> pure_ne_int(3)
579
    (True, True)
580
    """
581
    res1 = obj2 != 2
582
    res2 = 2 != obj2
583
    return res1, res2
584

585
@cython.test_fail_if_path_exists('//IntBinopNode')
586
@cython.test_fail_if_path_exists('//NumBinopNode')
587
@cython.test_fail_if_path_exists('//BinopNode')
588
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
589
def pure_and_int(obj2: int):
590
    """
591
    >>> pure_and_int(1)
592
    (0, 0)
593
    >>> pure_and_int(3)
594
    (2, 2)
595
    """
596
    res1 = obj2 & 2
597
    res2 = 2 & obj2
598
    return res1, res2
599

600
@cython.test_fail_if_path_exists('//IntBinopNode')
601
@cython.test_fail_if_path_exists('//NumBinopNode')
602
@cython.test_fail_if_path_exists('//BinopNode')
603
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
604
def pure_or_int(obj2: int):
605
    """
606
    >>> pure_or_int(1)
607
    (3, 3)
608
    >>> pure_or_int(0)
609
    (2, 2)
610
    """
611
    res1 = obj2 | 2
612
    res2 = 2 | obj2
613
    return res1, res2
614

615
@cython.test_fail_if_path_exists('//IntBinopNode')
616
@cython.test_fail_if_path_exists('//NumBinopNode')
617
@cython.test_fail_if_path_exists('//BinopNode')
618
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
619
def pure_xor_int(obj2: int):
620
    """
621
    >>> pure_xor_int(1)
622
    (3, 3)
623
    >>> pure_xor_int(3)
624
    (1, 1)
625
    """
626
    res1 = obj2 ^ 2
627
    res2 = 2 ^ obj2
628
    return res1, res2
629

630
@cython.test_fail_if_path_exists('//IntBinopNode')
631
@cython.test_fail_if_path_exists('//NumBinopNode')
632
@cython.test_fail_if_path_exists('//BinopNode')
633
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
634
def pure_rshift_int(obj2: int):
635
    """
636
    >>> pure_rshift_int(8)
637
    4
638
    """
639
    res = obj2 >> 1
640
    return res
641

642
@cython.test_fail_if_path_exists('//IntBinopNode')
643
@cython.test_fail_if_path_exists('//NumBinopNode')
644
@cython.test_fail_if_path_exists('//BinopNode')
645
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
646
def pure_lshift_int(obj2: int):
647
    """
648
    >>> pure_lshift_int(8)
649
    16
650
    """
651
    res = obj2 << 1
652
    return res
653

654
@cython.test_fail_if_path_exists('//IntBinopNode')
655
@cython.test_fail_if_path_exists('//NumBinopNode')
656
@cython.test_fail_if_path_exists('//BinopNode')
657
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
658
def pure_mod_int(obj2: int):
659
    """
660
    >>> pure_mod_int(3)
661
    1
662
    """
663
    res = obj2 % 2
664
    return res
665

666
@cython.test_fail_if_path_exists('//DivNode')
667
@cython.test_fail_if_path_exists('//NumBinopNode')
668
@cython.test_fail_if_path_exists('//BinopNode')
669
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
670
def pure_floordiv_int(obj2: int):
671
    """
672
    >>> pure_floordiv_int(3)
673
    1
674
    """
675
    res = obj2 // 2
676
    return res
677

678
import sys
679

680

681
@cython.test_fail_if_path_exists('//DivNode')
682
@cython.test_fail_if_path_exists('//NumBinopNode')
683
@cython.test_fail_if_path_exists('//BinopNode')
684
@cython.test_assert_path_exists('//PythonCapiFunctionNode')
685
def pure_truediv_int(obj2: int):
686
    """
687
    >>> pure_truediv_int(5)
688
    2.5
689
    """
690
    res = obj2 / 2
691
    return res
692

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.