hyb
2025-12-23 10f3a1daddfbc7fa3dd2069197d83e8b6ef19176
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
Ë
nñúh3ãó†—ddlmZddlmZmZmZmZmZddlm    Z    ddl
m Z ddl m Z mZmZmZmZddlZddlZddlmZddlmZmZmZdd    lmZdd
lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+dd l,m-Z.dd l/m0Z0m1Z1m2Z2dd l3m4Z4m5Z5m6Z6ddl7m8Z8ddl9m:Z:ddl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEddlFmGZGmHZHddlImJZJmKZKddlLmMZMddlNmOZOmPZPddlQmRcmSZddlTmUZUddlVmWZWmXZXddlYmZZZm[Z[ddl\mRcm]Z^ddl_m`Z`ddlamRcmbcmcZdddlameZemfZfmgZgmhZhddlimjZjddlkmlZlddlmmnZnmoZoddlpmqZqmrZre r
ddlsmtZtmuZumvZvewedjð«Zxexjódd d!œ«Gd"„d#ejôejö«Z|Gd$„d%ejôejú«Z~d.d&„ZGd'„dee«Z€d/d(„Zd0d1d)„Z‚d2d*„Zƒd3d+„Z„d4d5d,„Z…d6d-„Z†y)7é)Ú annotations)Ú
CollectionÚ    GeneratorÚHashableÚIterableÚSequence)Úwraps©Ú    getsizeof)Ú TYPE_CHECKINGÚAnyÚCallableÚLiteralÚcastN)Ú
get_option)ÚalgosÚindexÚlib)Ú
duplicated) ÚAnyAllÚ AnyArrayLikeÚAxisÚDropKeepÚDtypeObjÚFÚ IgnoreRaiseÚ
IndexLabelÚScalarÚSelfÚShapeÚnpt)Úfunction)ÚInvalidIndexErrorÚPerformanceWarningÚUnsortedIndexError)ÚAppenderÚcache_readonlyÚdoc)Úfind_stack_level)Úcoerce_indexer_dtype)
Ú ensure_int64Úensure_platform_intÚ is_hashableÚ
is_integerÚ is_iteratorÚ is_list_likeÚis_object_dtypeÚ    is_scalarÚis_string_dtypeÚ pandas_dtype)ÚCategoricalDtypeÚExtensionDtype)Ú ABCDataFrameÚ    ABCSeries)Ú is_array_like)Úarray_equivalentÚisna)Úvalidate_putmask)Ú CategoricalÚExtensionArray)Úfactorize_from_iterablesÚrecode_for_categories)Úsanitize_array)ÚIndexÚ_index_shared_docsÚ ensure_indexÚget_unanimous_names)Ú
FrozenList)Úmake_invalid_op)Úget_group_indexÚlexsort_indexer)Úget_adjustmentÚ pprint_thing)ÚCategoricalIndexÚ    DataFrameÚSeriesÚ
MultiIndexzMultiIndex or list of tuples)ÚklassÚ target_klasscó.—eZdZdZej
Zd„Zy)ÚMultiIndexUIntEngineza
    This class manages a MultiIndex by mapping label combinations to positive
    integers.
    có¾—||jz}|jdk(rtjj    |«Stjj    |d¬«S)a
        Transform combination(s) of uint64 in one uint64 (each), in a strictly
        monotonic way (i.e. respecting the lexicographic order of integer
        combinations): see BaseMultiIndexCodesEngine documentation.
 
        Parameters
        ----------
        codes : 1- or 2-dimensional array of dtype uint64
            Combinations of integers (one per row)
 
        Returns
        -------
        scalar or 1-dimensional array, of dtype uint64
            Integer(s) representing one combination (each).
        é©Úaxis)ÚoffsetsÚndimÚnpÚ
bitwise_orÚreduce©ÚselfÚcodess  úLH:\Change_password\venv_build\Lib\site-packages\pandas/core/indexes/multi.pyÚ_codes_to_intsz#MultiIndexUIntEngine._codes_to_ints‰sP€ð$    $—,‘,шð
:‰:˜Š?ä—=‘=×'Ñ'¨Ó.Ð .ô}‰}×#Ñ# E°Ð#Ó2Ð2óN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚlibindexÚ UInt64EngineÚ_basera©rbr`rSrSs„ñð
× !Ñ !€Eó3rbrScó.—eZdZdZej
Zd„Zy)ÚMultiIndexPyIntEnginezÂ
    This class manages those (extreme) cases in which the number of possible
    label combinations overflows the 64 bits integers, and uses an ObjectEngine
    containing Python integers.
    cóܗ|jd«|jz}|jdk(rtjj |«Stjj |d¬«S)a
        Transform combination(s) of uint64 in one Python integer (each), in a
        strictly monotonic way (i.e. respecting the lexicographic order of
        integer combinations): see BaseMultiIndexCodesEngine documentation.
 
        Parameters
        ----------
        codes : 1- or 2-dimensional array of dtype uint64
            Combinations of integers (one per row)
 
        Returns
        -------
        int, or 1-dimensional array of dtype object
            Integer(s) representing one combination (each).
        ÚobjectrUrV)ÚastyperXrYrZr[r\r]s  r`raz$MultiIndexPyIntEngine._codes_to_ints±sY€ð&— ‘ ˜XÓ&¨$¯,©,Ñ6ˆð
:‰:˜Š?ä—=‘=×'Ñ'¨Ó.Ð .ô}‰}×#Ñ# E°Ð#Ó2Ð2rbN)rcrdrerfrgÚ ObjectEnginerirarjrbr`rlrl¨s„ñð × !Ñ !€Eó3rbrlcóJ‡—t‰«ˆfd„«}tt|«S)z†
    A decorator to allow either `name` or `names` keyword but not both.
 
    This makes it easier to share code with base class.
    cór•—d|vrd|vr td«‚d|vr|jd«|d<‰|g|¢­i|¤ŽS)NÚnameÚnamesz*Can only provide one of `names` and `name`)Ú    TypeErrorÚpop)Ú self_or_clsÚargsÚkwargsÚmeths   €r`Únew_methznames_compat.<locals>.new_methØsMø€à VÑ  ¨6Ñ 1ÜÐHÓIÐ IØ VÑ Ø$Ÿj™j¨Ó0ˆF7‰OáKÐ1 $Ò1¨&Ñ1Ð1rb)r    rr)rzr{s` r`Ú names_compatr|Ñs*ø€ô ˆ4ƒ[ó2óð2ô ”8Ó Ðrbcó
‡—eZdZUdZej
e«zZdZgZde    d<e
«Z e
«Z dgZ de    d<                                d–                    d—d „Zd˜d „Z            d™                    dšd „Zedej&f                    d›d„«Zee        dœ                            dd„««Zedej&f                            džd„«Ze        dœ                            dŸd„«Zed d„«Zed d„«Zed„«Zed¡d„«Zd¢d„Zed¢d„«Z ed£d„«Z!dd    d
d    dœ                            d¤d„Z"dd
dœ            d¥d„Z#ed¢d„«Z$ed¦d„«Z%ed£d„«Z&dd    d
d    dœ                            d¤d „Z'dd
dœ            d¥d!„Z(ed"„«Z)ed§d#„«Z*e+ejX«ej&fd¨d$„«Z,d©d%„Z-            dª            d«d&„Z.dœd d'„Z/d¬d­d(„Z0e+ejb«d®d)„«Z1ed¯d*„«Z2d°d+„Z3e+ejh«d±d²d,„«Z4ed¢d-„«Z5d±d²d.„Z6d/„Z7d0d1œ            d³d2„Z8                            d´                                                    dµd3„Z9dd4œ                            d¶d5„Z:d£d6„Z;dd
d7œd·d8„Z<ee<e;d9¬:«Z=ed¸d;„«Z>d¢d<„Z?ed°d=„«Z@ed°d>„«ZAed¹d?„«ZBe+ej†«dºd»d@„«ZCeCZDdœdA„ZEe+ejŒ«d¼d½dB„«ZFd±d¾dC„ZGd¿dD„ZHe+ej’«d¬dE„«ZId
ej&d    f                    dÀdF„ZJd¿dG„ZKd°dH„ZLed¢dI„«ZMd±dÁdJ„ZNd©dK„ZOdL„ZPdM„ZQdÂdN„ZReSeTdOeUz«            dà                           dÄdP„«ZVdQ„ZWdRdSœ            dÅdT„ZXeSeTdUeUz«d¬dÆdV„«ZY        dÇ                    dÈdW„ZZ    dÉ            dÊdX„Z[dËd©dY„Z\d©dZ„Z]d©d[„Z^    dÌ            dÍd\„Z_dÎd]„Z`                dÏ                                    dÐd^„ZadÑd_„ZbdÒd`„ZcdÓda„Zded°db„«Ze                dԈfdc„ ZfdՈfdd„ ZgdÖde„Zh                        d×df„Zid™d؈fdg„ ZjdÙdÚdh„ZkdÛdi„Zldj„ZmdÜdÝdk„ZndÞdßdl„Zo    dà            dádm„ZpdÖdn„Zq                        dâdo„Zrdœd©dp„Zsdãdq„Ztdädr„Zud©ˆfds„ Zvdådt„Zwd©du„Zxdv„Zyd©dw„Zzdædx„Z{dy„Z|e+ejú«dÌdçdz„«Z}d{„Z~dèd|„Zdéd}„Z€d©d~„Ze+ej«d¬dêd„«Z‚ejZ„e…d€«Z†e…d«Z‡e…d‚«Zˆe…dƒ«Z‰e…d„«ZŠe…d…«Z‹e…d†«ZŒe…d‡«Ze…dˆ«ZŽe…d‰«Ze…dŠ«Ze…d‹«Z‘e…dŒ«Z’e…d«Z“e…dŽ«Z”e…d«Z•e…d«Z–e…d‘«Z—e…d’«Z˜e…d“«Z™e…d”«Zše…d•«Z›ˆxZœS)ërOaö
    A multi-level, or hierarchical, index object for pandas objects.
 
    Parameters
    ----------
    levels : sequence of arrays
        The unique labels for each level.
    codes : sequence of arrays
        Integers for each level designating which label at each location.
    sortorder : optional int
        Level of sortedness (must be lexicographically sorted by that
        level).
    names : optional sequence of objects
        Names for each of the index levels. (name is accepted for compat).
    copy : bool, default False
        Copy the meta-data.
    verify_integrity : bool, default True
        Check that the levels/codes are consistent and valid.
 
    Attributes
    ----------
    names
    levels
    codes
    nlevels
    levshape
    dtypes
 
    Methods
    -------
    from_arrays
    from_tuples
    from_product
    from_frame
    set_levels
    set_codes
    to_frame
    to_flat_index
    sortlevel
    droplevel
    swaplevel
    reorder_levels
    remove_unused_levels
    get_level_values
    get_indexer
    get_loc
    get_locs
    get_loc_level
    drop
 
    See Also
    --------
    MultiIndex.from_arrays  : Convert list of arrays to MultiIndex.
    MultiIndex.from_product : Create a MultiIndex from the cartesian product
                              of iterables.
    MultiIndex.from_tuples  : Convert list of tuples to a MultiIndex.
    MultiIndex.from_frame   : Make a MultiIndex from a DataFrame.
    Index : The base pandas Index type.
 
    Notes
    -----
    See the `user guide
    <https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html>`__
    for more.
 
    Examples
    --------
    A new ``MultiIndex`` is typically constructed using one of the helper
    methods :meth:`MultiIndex.from_arrays`, :meth:`MultiIndex.from_product`
    and :meth:`MultiIndex.from_tuples`. For example (using ``.from_arrays``):
 
    >>> arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
    >>> pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
    MultiIndex([(1,  'red'),
                (1, 'blue'),
                (2,  'red'),
                (2, 'blue')],
               names=['number', 'color'])
 
    See further examples for how to construct a MultiIndex in the doc strings
    of the mentioned helper methods.
    Ú
multiindexzlist[Hashable | None]Ú_namesrtú
int | NoneÚ    sortorderNFTc    ó —||}||€ td«‚t|«t|«k7r td«‚t|«dk(r td«‚tj    |«}    i|    _|    j ||d¬«|    j||d¬«dgt|«z|    _||    j|«|t|«|    _ n||    _ |r|    j«}
|
|    _ |    j«d|    _|    S)NzMust pass both levels and codesz,Length of levels and codes must be the same.rz)Must pass non-zero number of levels/codesF)ÚcopyÚvalidate)ruÚlenÚ
ValueErrorrnÚ__new__Ú_cacheÚ _set_levelsÚ
_set_codesrÚ
_set_namesÚintrÚ_verify_integrityÚ_codesÚ_reset_identityÚ _references) ÚclsÚlevelsr_rrtÚdtyperƒrsÚverify_integrityÚresultÚ    new_codess            r`r‡zMultiIndex.__new__Fs
€ð Р؈EØ ˆ>˜U˜]ÜÐ=Ó>Ð >Ü ˆv‹;œ#˜e›*Ò $ÜÐKÓLÐ LÜ ˆv‹;˜!Ò ÜÐHÓIÐ Iä—‘ Ó$ˆØˆŒ ð    ×ј6¨°uÐÔ=Ø×ј% d°UÐÔ;à˜¤ V£Ñ,ˆŒ Ø Ð à × Ñ ˜eÔ $à Ð  Ü" 9›~ˆFÕ à(ˆFÔ á Ø×0Ñ0Ó2ˆIØ%ˆFŒMà×ÑÔ Ø!ˆÔàˆ rbcóz—t|«}tj|«rtj||d|«}|S)a”
        Reassign code values as -1 if their corresponding levels are NaN.
 
        Parameters
        ----------
        code : list
            Code to reassign.
        level : list
            Level to check for missing values (NaN, NaT, None).
 
        Returns
        -------
        new code where code value = -1 if it corresponds
        to a level with missing values (NaN, NaT, None).
        éÿÿÿÿ)r;rZÚanyÚwhere)r^ÚlevelÚcodeÚ    null_masks    r`Ú_validate_codeszMultiIndex._validate_codesus6€ô ˜“Kˆ    Ü 6‰6)Ô ô—8‘8˜I d™O¨R°Ó6ˆD؈ rbc ó‚—|xs |j}|xs |j}|€tt|««}t|«t|«k7r t    d«‚t|d«}|D]ö}||}||}t|«|k7r%t    d|Dcgc] }t|«‘Œc}›«‚t|«rH|j «t|«k\r,t    d|›d|j «›dt|«›d«‚t|«r3|j «dkr t    d|›d    |j «›d
«‚|jrŒÞt    d t|«›d |›«‚|jf|jt|j|j«kDr9t    d |j›dt|j|j«›«‚g}    tt|««D]B}||vr(|    j|j||||««Œ/|    j||«ŒDt|    «}
|
Scc}w)a
        Parameters
        ----------
        codes : optional list
            Codes to check for validity. Defaults to current codes.
        levels : optional list
            Levels to check for validity. Defaults to current levels.
        levels_to_validate: optional list
            Specifies the levels to verify.
 
        Raises
        ------
        ValueError
            If length of levels and codes don't match, if the codes for any
            level would exceed level bounds, or there are any duplicate levels.
 
        Returns
        -------
        new codes where code value = -1 if it corresponds to a
        NaN level.
        zTLength of levels and codes must match. NOTE: this index is in an inconsistent state.rzUnequal code lengths: z    On level z , code max (z) >= length of level (z/). NOTE: this index is in an inconsistent stater˜z, code value (z) < -1zLevel values must be unique: z
 on level zQValue for sortorder must be inferior or equal to actual lexsort_depth: sortorder z with lexsort_depth )r_r’Úranger…r†ÚmaxÚminÚ    is_uniqueÚlistrÚ_lexsort_depthÚnlevelsÚappendržrF) r^r_r’Úlevels_to_verifyÚ codes_lengthÚir›Ú level_codesÚcode_Ú result_codesr–s            r`rzMultiIndex._verify_integritysN€ð:Ò#˜Ÿ™ˆØÒ&˜4Ÿ;™;ˆØ Ð #Ü$¤S¨£[Ó1Ð ä ˆv‹;œ#˜e›*Ò $Üð:óð ô˜5 ™8“}ˆ Ø!ò    ˆAؘ1‘IˆEØ ™(ˆKä;Ó <Ò/Ü Ø,ÀeÖ-L¸U¬c°%­jÒ-LÐ,MÐNóðô;Ô K§O¡OÓ$5¼¸U»Ò$CÜ Ø ˜s ,¨{¯©Ó/@Ð.AðBÜ! %›j˜\ð*)ð)óðô
;Ô K§O¡OÓ$5¸Ò$:Ü  9¨Q¨C¨~¸k¿o¹oÓ>OÐ=PÐPVÐ!WÓXÐXØ—?“?Ü Ø3´D¸³K°=À
È1È#ÐNóðð#    ð( >‰>Ð %؏~‰~¤¨t¯z©z¸4¿<¹<Ó HÒHÜ ð0Ø04·±Ð/?ð@*Ü*8¸¿¹ÀTÇ\Á\Ó*RÐ)SðUóðð ˆ Ü”s˜6“{Ó#ò    .ˆAØÐ$Ñ$Ø×#Ñ# D×$8Ñ$8¸À¹ÀEÈ!ÁHÓ$MÕNà×#Ñ# E¨!¡HÕ-ð        .ô ˜|Ó,ˆ    ØÐùò=.MsÂH< cóº—d}t|«s t|«‚t|«r t|«}|D]}t|«rŒt|«‚t    dt |««D]-}t ||«t ||dz
«k7sŒ$t d«‚t|«\}}|tjur|D    cgc]}    t|    dd«‘Œ}}    |||||d¬«Scc}    w)až
        Convert arrays to MultiIndex.
 
        Parameters
        ----------
        arrays : list / sequence of array-likes
            Each array-like gives one level's value for each data point.
            len(arrays) is the number of levels.
        sortorder : int or None
            Level of sortedness (must be lexicographically sorted by that
            level).
        names : list / sequence of str, optional
            Names for the levels in the index.
 
        Returns
        -------
        MultiIndex
 
        See Also
        --------
        MultiIndex.from_tuples : Convert list of tuples to MultiIndex.
        MultiIndex.from_product : Make a MultiIndex from cartesian product
                                  of iterables.
        MultiIndex.from_frame : Make a MultiIndex from a DataFrame.
 
        Examples
        --------
        >>> arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
        >>> pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
        MultiIndex([(1,  'red'),
                    (1, 'blue'),
                    (2,  'red'),
                    (2, 'blue')],
                   names=['number', 'color'])
        z/Input must be a list / sequence of array-likes.rUzall arrays must be same lengthrsNF©r’r_rrtr”) r0rur/r¤r r…r†r?rÚ
no_defaultÚgetattr)
r‘ÚarraysrrtÚ    error_msgÚarrayrªr_r’Úarrs
          r`Ú from_arrayszMultiIndex.from_arraysÛsô€ðTFˆ    Ü˜FÔ#ܘIÓ&Ð &Ü vÔ Ü˜&“\ˆFðò    +ˆEÜ Õ&Ü     Ó*Ð*ð    +ô qœ#˜f›+Ó&ò    CˆAܐ6˜!‘9‹~¤ V¨A°©E¡]Ó!3Ó3Ü Ð!AÓBÐBð    Cô1°Ó8‰ ˆˆvØ ”C—N‘NÑ "Ø;AÖB°C”W˜S &¨$Õ/ÐBˆEÐBáØØØØØ"ô 
ð    
ùòCsÂ5CcóÀ—t|«s td«‚t|«r t|«}t    t
t tdf|«}t|«rrtd„|D««r`tjt|««g}ttj|tjd«¬««g}|||||d¬«St|«dk(r|€ td    «‚ggt|«z}n×t!|tj"tf«rXt!|t«rtj$|j&«}tt)j*|«j,«}n_t!|t«r)tt)j.|«j,«}n&t1|Ž}t    tt2t|«}|j5|||¬
«S) a}
        Convert list of tuples to MultiIndex.
 
        Parameters
        ----------
        tuples : list / sequence of tuple-likes
            Each tuple is the index of one row/column.
        sortorder : int or None
            Level of sortedness (must be lexicographically sorted by that
            level).
        names : list / sequence of str, optional
            Names for the levels in the index.
 
        Returns
        -------
        MultiIndex
 
        See Also
        --------
        MultiIndex.from_arrays : Convert list of arrays to MultiIndex.
        MultiIndex.from_product : Make a MultiIndex from cartesian product
                                  of iterables.
        MultiIndex.from_frame : Make a MultiIndex from a DataFrame.
 
        Examples
        --------
        >>> tuples = [(1, 'red'), (1, 'blue'),
        ...           (2, 'red'), (2, 'blue')]
        >>> pd.MultiIndex.from_tuples(tuples, names=('number', 'color'))
        MultiIndex([(1,  'red'),
                    (1, 'blue'),
                    (2,  'red'),
                    (2, 'blue')],
                   names=['number', 'color'])
        z/Input must be a list / sequence of tuple-likes..c3óFK—|]}t|t«xr| –—Œy­w©N)Ú
isinstanceÚtuple)Ú.0Úes  r`ú    <genexpr>z)MultiIndex.from_tuples.<locals>.<genexpr>Ts!èø€ÒNÀ!œz¨!¬UÓ3Ò=¸A¸Ó=ÑNùs‚!rn©r“Fr¯rz-Cannot infer number of levels from empty list©rrt)r0rur/r¤rrr»rr…ÚallrZÚzerosrBÚcomÚasarray_tuplesafer“rºÚndarrayÚasarrayÚ_valuesrÚtuples_to_object_arrayÚTÚto_object_array_tuplesÚziprr¶)r‘Útuplesrrtr_r’r²Úarrss        r`Ú from_tupleszMultiIndex.from_tuples"s‚€ôV˜FÔ#ÜÐMÓNÐ NÜ vÔ Ü˜&“\ˆFÜ”j¤¤x° }Ñ!5Ñ6¸Ó?ˆô ˆvŒ;œ3ÑNÀvÔNÔNÜ—X‘Xœc &›kÓ*Ð+ˆEÜœC×1Ñ1°&ÄÇÁÈÓ@RÔSÓTÐUˆFÙØØØ#ØØ!&ô ð ô ˆv‹;˜!Ò Øˆ}ÜРOÓPÐPðTœC ›JÑ&‰FÜ ˜¤§¡¬UР3Ô 4ܘ&¤%Ô(ÜŸ™ F§N¡NÓ3äœ#×4Ñ4°VÓ<×>Ñ>Ó?‰FÜ ˜¤Ô %Üœ#×4Ñ4°VÓ<×>Ñ>Ó?‰F䘐<ˆDÜœ$œx¬Ñ1Ñ2°DÓ9ˆFà‰˜v°À%ˆÓHÐHrbcó —ddlm}t|«s td«‚t    |«r t |«}t |«\}}|tjur|Dcgc]}t|dd«‘Œ}}||«}|||||¬«Scc}w)at
        Make a MultiIndex from the cartesian product of multiple iterables.
 
        Parameters
        ----------
        iterables : list / sequence of iterables
            Each iterable has unique labels for each level of the index.
        sortorder : int or None
            Level of sortedness (must be lexicographically sorted by that
            level).
        names : list / sequence of str, optional
            Names for the levels in the index.
            If not explicitly provided, names will be inferred from the
            elements of iterables if an element has a name attribute.
 
        Returns
        -------
        MultiIndex
 
        See Also
        --------
        MultiIndex.from_arrays : Convert list of arrays to MultiIndex.
        MultiIndex.from_tuples : Convert list of tuples to MultiIndex.
        MultiIndex.from_frame : Make a MultiIndex from a DataFrame.
 
        Examples
        --------
        >>> numbers = [0, 1, 2]
        >>> colors = ['green', 'purple']
        >>> pd.MultiIndex.from_product([numbers, colors],
        ...                            names=['number', 'color'])
        MultiIndex([(0,  'green'),
                    (0, 'purple'),
                    (1,  'green'),
                    (1, 'purple'),
                    (2,  'green'),
                    (2, 'purple')],
                   names=['number', 'color'])
        r)Úcartesian_productz-Input must be a list / sequence of iterables.rsNrÀ)
Úpandas.core.reshape.utilrÐr0rur/r¤r?rr°r±)r‘Ú    iterablesrrtrÐr_r’Úits        r`Ú from_productzMultiIndex.from_productss†€õ\    ?ä˜IÔ&ÜÐKÓLÐ LÜ yÔ !ܘY›ˆIä0°Ó;‰ ˆˆvØ ”C—N‘NÑ "Ø9BÖC°2”W˜R ¨Õ.ÐCˆEÐCñ" %Ó(ˆÙ6˜5¨I¸UÔCÐCùò    DsÁBcóž—t|t«s td«‚t|j    «Ž\}}|€|n|}|j |||¬«S)aK
        Make a MultiIndex from a DataFrame.
 
        Parameters
        ----------
        df : DataFrame
            DataFrame to be converted to MultiIndex.
        sortorder : int, optional
            Level of sortedness (must be lexicographically sorted by that
            level).
        names : list-like, optional
            If no names are provided, use the column names, or tuple of column
            names if the columns is a MultiIndex. If a sequence, overwrite
            names with the given sequence.
 
        Returns
        -------
        MultiIndex
            The MultiIndex representation of the given DataFrame.
 
        See Also
        --------
        MultiIndex.from_arrays : Convert list of arrays to MultiIndex.
        MultiIndex.from_tuples : Convert list of tuples to MultiIndex.
        MultiIndex.from_product : Make a MultiIndex from cartesian product
                                  of iterables.
 
        Examples
        --------
        >>> df = pd.DataFrame([['HI', 'Temp'], ['HI', 'Precip'],
        ...                    ['NJ', 'Temp'], ['NJ', 'Precip']],
        ...                   columns=['a', 'b'])
        >>> df
              a       b
        0    HI    Temp
        1    HI  Precip
        2    NJ    Temp
        3    NJ  Precip
 
        >>> pd.MultiIndex.from_frame(df)
        MultiIndex([('HI',   'Temp'),
                    ('HI', 'Precip'),
                    ('NJ',   'Temp'),
                    ('NJ', 'Precip')],
                   names=['a', 'b'])
 
        Using explicit names, instead of the column names
 
        >>> pd.MultiIndex.from_frame(df, names=['state', 'observation'])
        MultiIndex([('HI',   'Temp'),
                    ('HI', 'Precip'),
                    ('NJ',   'Temp'),
                    ('NJ', 'Precip')],
                   names=['state', 'observation'])
        zInput must be a DataFramerÀ)rºr7rurËÚitemsr¶)r‘ÚdfrrtÚ column_namesÚcolumnss      r`Ú
from_framezMultiIndex.from_frame°sP€ô|˜"œlÔ+ÜÐ7Ó8Ð 8ä # R§X¡X£ZР0ш gØ %  ‘ °5ˆØ‰˜w°)À5ˆÓIÐIrbcóV—g}t|j«D]ù}|j|}|j|}|}t    |j
t «r&td|«}|jj«}t    |j
t«s tj|j
d«r|jt«}tj |«}t#j$|||j&¬«}|j)|«Œûtj*|«}|S)NrLÚmM©Ú
fill_value)r r¦r’r_rºr“r5rÚ_dataÚ_internal_get_valuesr6rÚ is_np_dtyperornrZrÆrÚtake_ndÚ    _na_valuer§Úfast_zip)r^Úvaluesrªrr_Úvalsrµs       r`rÇzMultiIndex._values÷så€ðˆät—|‘|Ó$ò     ˆAØ—K‘K ‘NˆEØ—J‘J˜q‘MˆEàˆDܘ$Ÿ*™*Ô&6Ô7ÜÐ.°Ó5Ø—z‘z×6Ñ6Ó8ä˜$Ÿ*™*¤nÔ5¼¿¹Ø—
‘
˜Dô:ð—{‘{¤6Ó*ä—:‘:˜dÓ#ˆDÜ—=‘=  u¸¿¹ÔIˆDØ M‰M˜$Õ ð!     ô$l‰l˜6Ó"ˆØˆ
rbcó—|jSr¹©rÇ©r^s r`råzMultiIndex.valuess €à|‰|Ðrbcó—td«‚)z¦
        Raises a ValueError for `MultiIndex` because there's no single
        array backing a MultiIndex.
 
        Raises
        ------
        ValueError
        zcMultiIndex has no single backing array. Use 'MultiIndex.to_numpy()' to get a NumPy array of tuples.)r†rés r`r´zMultiIndex.arrays€ôð Fó
ð    
rbcóú—ddlm}tj|jDcgc]}|j
‘Œc}«}||jDcgc]}|j ‘Œc}t|«¬«Scc}wcc}w)ax
        Return the dtypes as a Series for the underlying MultiIndex.
 
        Examples
        --------
        >>> idx = pd.MultiIndex.from_product([(0, 1, 2), ('green', 'purple')],
        ...                                  names=['number', 'color'])
        >>> idx
        MultiIndex([(0,  'green'),
                    (0, 'purple'),
                    (1,  'green'),
                    (1, 'purple'),
                    (2,  'green'),
                    (2, 'purple')],
                   names=['number', 'color'])
        >>> idx.dtypes
        number     int64
        color     object
        dtype: object
        r)rN)r)ÚpandasrNrÃÚfill_missing_namesr’rsr“rB)r^rNr›rts    r`ÚdtypeszMultiIndex.dtypes$sW€õ,    "ä×&Ñ&ÀÇ Á Ö'L°u¨¯
«
Ò'LÓMˆÙ°· ± Ö< uu—{“{Ò<ÄEÈ%ÃLÔQÐQùò(MùÚ<s ¤A3ÁA8có2—t|jd«S©Nr)r…r_rés r`Ú__len__zMultiIndex.__len__?s€Ü4—:‘:˜a‘=Ó!Ð!rbcó—t|«S)zG
        Return the number of elements in the underlying data.
        ©r…rés r`ÚsizezMultiIndex.sizeBs€ô 4‹yÐrbcóėt|j|j«Dcgc]\}}|j|¬«‘Œ}}}|D]    }d|_Œ t |«Scc}}w)aA
        Levels of the MultiIndex.
 
        Levels refer to the different hierarchical levels or layers in a MultiIndex.
        In a MultiIndex, each level represents a distinct dimension or category of
        the index.
 
        To access the levels, you can use the levels attribute of the MultiIndex,
        which returns a tuple of Index objects. Each Index object represents a
        level in the MultiIndex and contains the unique values found in that
        specific level.
 
        If a MultiIndex is created with levels A, B, C, and the DataFrame using
        it filters out all rows of the level C, MultiIndex.levels will still
        return A, B, C.
 
        Examples
        --------
        >>> index = pd.MultiIndex.from_product([['mammal'],
        ...                                     ('goat', 'human', 'cat', 'dog')],
        ...                                    names=['Category', 'Animals'])
        >>> leg_num = pd.DataFrame(data=(4, 2, 4, 4), index=index, columns=['Legs'])
        >>> leg_num
                          Legs
        Category Animals
        mammal   goat        4
                 human       2
                 cat         4
                 dog         4
 
        >>> leg_num.index.levels
        FrozenList([['mammal'], ['cat', 'dog', 'goat', 'human']])
 
        MultiIndex levels will not change even if the DataFrame using the MultiIndex
        does not contain all them anymore.
        See how "human" is not in the DataFrame, but it is still in levels:
 
        >>> large_leg_num = leg_num[leg_num.Legs > 2]
        >>> large_leg_num
                          Legs
        Category Animals
        mammal   goat        4
                 cat         4
                 dog         4
 
        >>> large_leg_num.index.levels
        FrozenList([['mammal'], ['cat', 'dog', 'goat', 'human']])
        ©rsT)rËÚ_levelsrÚ_renameÚ_no_setting_namerF)r^Úxrsr•r›s     r`r’zMultiIndex.levelsMs`€ôj7:¸$¿,¹,ÈÏ É Ó6T×U©7¨1¨d!—)‘) )Õ&ÐUˆÑUØò    *ˆEà%)ˆEÕ "ð    *ô˜&Ó!Ð!ùó    Vs¤A)r›rƒr„r”cóÖ‡—|rbt|«dk(r td«‚|€#t|«|jk7r td«‚|"t|«t|«k7r td«‚|€2tˆfd„|D««}t    t t|«««}np|Dcgc]}|j |«‘Œ}}t    |j«}    t||«D]#\}
}t|‰¬«j«|    |
<Œ%t|    «}|r|j||¬«} | |_ |j} ||_t| «r|j| «|j!«ycc}w)Nrz#Must set non-zero number of levels.z-Length of levels must match number of levels.z,Length of levels must match length of level.c3óT•K—|]}t|‰¬«j«–—Œ!y­w©©rƒN)rDÚ_view)r¼Úlevrƒs  €r`r¾z)MultiIndex._set_levels.<locals>.<genexpr>s&øèø€ò$Ø9<” ˜S tÔ,×2Ñ2×4ñ$ùsƒ%(rþ)r’r¨)r…r†r¦rFr¤r Ú_get_level_numberr÷rËrDrÿrrŽrtr™r‹Ú _reset_cache) r^r’r›rƒr„r”Ú
new_levelsÚ level_numbersrÚnew_levels_listÚlev_numr–rts    `         r`r‰zMultiIndex._set_levelsˆsYø€ñ ܐ6‹{˜aÒÜ Ð!FÓGÐG؈}¤ V£°· ± Ò!<Ü Ð!PÓQÐQØÐ ¤S¨£[´C¸³JÒ%>Ü Ð!OÓPÐPà ˆ=Ü#ó$Ø@Fô$óˆJô!¤¤s¨:£Ó!7Ó8‰MàDIÖJ¸S˜T×3Ñ3°CÕ8ÐJˆMÐJÜ" 4§<¡<Ó0ˆOÜ # M°6Ó :ò P‘ ˜Ü+7¸À$Ô+G×+MÑ+MÓ+O Ò(ð Pä# OÓ4ˆJá Ø×.Ñ.Ø!°Mð/óˆIð$ˆDŒKà—
‘
ˆØ!ˆŒ Ü ˆuŒ:Ø O‰O˜EÔ "à ×ÑÕùò#KsÂE&©r›r”có —t|t«rn-t|«r t|«}nt|«r t    |«}t ||d«\}}|j «}|j«|j||d|¬«|S)aé    
        Set new levels on MultiIndex. Defaults to returning new index.
 
        Parameters
        ----------
        levels : sequence or list of sequence
            New level(s) to apply.
        level : int, level name, or sequence of int/level names (default None)
            Level(s) to set (None for all levels).
        verify_integrity : bool, default True
            If True, checks that levels and codes are compatible.
 
        Returns
        -------
        MultiIndex
 
        Examples
        --------
        >>> idx = pd.MultiIndex.from_tuples(
        ...     [
        ...         (1, "one"),
        ...         (1, "two"),
        ...         (2, "one"),
        ...         (2, "two"),
        ...         (3, "one"),
        ...         (3, "two")
        ...     ],
        ...     names=["foo", "bar"]
        ... )
        >>> idx
        MultiIndex([(1, 'one'),
            (1, 'two'),
            (2, 'one'),
            (2, 'two'),
            (3, 'one'),
            (3, 'two')],
           names=['foo', 'bar'])
 
        >>> idx.set_levels([['a', 'b', 'c'], [1, 2]])
        MultiIndex([('a', 1),
                    ('a', 2),
                    ('b', 1),
                    ('b', 2),
                    ('c', 1),
                    ('c', 2)],
                   names=['foo', 'bar'])
        >>> idx.set_levels(['a', 'b', 'c'], level=0)
        MultiIndex([('a', 'one'),
                    ('a', 'two'),
                    ('b', 'one'),
                    ('b', 'two'),
                    ('c', 'one'),
                    ('c', 'two')],
                   names=['foo', 'bar'])
        >>> idx.set_levels(['a', 'b'], level='bar')
        MultiIndex([(1, 'a'),
                    (1, 'b'),
                    (2, 'a'),
                    (2, 'b'),
                    (3, 'a'),
                    (3, 'b')],
                   names=['foo', 'bar'])
 
        If any of the levels passed to ``set_levels()`` exceeds the
        existing length, all of the values from that argument will
        be stored in the MultiIndex levels, though the values will
        be truncated in the MultiIndex output.
 
        >>> idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1])
        MultiIndex([('a', 1),
            ('a', 2),
            ('b', 1),
            ('b', 2),
            ('c', 1),
            ('c', 2)],
           names=['foo', 'bar'])
        >>> idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1]).levels
        FrozenList([['a', 'b', 'c'], [1, 2, 3, 4]])
        ÚLevelsT)r›r„r”)    rºrBr9r0r¤Ú_require_listlikerÿrr‰)r^r’r›r”Úidxs     r`Ú
set_levelszMultiIndex.set_levelsµs€ôf fœeÔ $Ø Ü ˜6Ô "ܘ6“]‰FÜ ˜&Ô !ܘ&“\ˆFä)¨%°¸ÓB‰ ˆˆv؏j‰j‹lˆØ ×ÑÔØ ‰Ø ˜%¨$ÐAQð    ô    
ðˆ
rbcó,—t|j«S)a
        Integer number of levels in this MultiIndex.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([['a'], ['b'], ['c']])
        >>> mi
        MultiIndex([('a', 'b', 'c')],
                   )
        >>> mi.nlevels
        3
        )r…r÷rés r`r¦zMultiIndex.nlevelss€ô4—<‘<ӠРrbcó:—td„|jD««S)a
        A tuple with the length of each level.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([['a'], ['b'], ['c']])
        >>> mi
        MultiIndex([('a', 'b', 'c')],
                   )
        >>> mi.levshape
        (1, 1, 1)
        c3ó2K—|]}t|«–—Œy­wr¹ró©r¼rús  r`r¾z&MultiIndex.levshape.<locals>.<genexpr>5sèø€Ò1 ”S˜—VÑ1ùó‚)r»r’rés r`ÚlevshapezMultiIndex.levshape's€ôÑ1 T§[¡[Ô1Ó1Ð1rbcó—|jSr¹)rŽrés r`r_zMultiIndex.codes:s €à{‰{Ðrbcó`‡—|rI|€#t|«|jk7r td«‚|"t|«t|«k7r td«‚|€=tˆfd„t    |j
|«D««}t t|««}nr|Dcgc]}|j|«‘Œ}}t|j«}    t    ||«D]%\}
} |j|
}t| |‰¬«|    |
<Œ't|    «}|r|j||¬«}||_    |j«ycc}w)Nz+Length of codes must match number of levelsz,Length of codes must match length of levels.c3ó\•K—|]#\}}t||‰¬«j«–—Œ%y­wrý)Ú_coerce_indexer_frozenÚview)r¼rr«rƒs   €r`r¾z(MultiIndex._set_codes.<locals>.<genexpr>Os/øèø€ò#á$C˜ô' {°C¸dÔC×HÑH×Jñ#ùsƒ),rþ)r_r¨)r…r¦r†rFrËr÷r rr¤rŽr’rrr) r^r_r›rƒr„r”r–rrÚnew_codes_listrr«s    `        r`rŠzMultiIndex._set_codes>s1ø€ñ ؈}¤ U£¨t¯|©|Ò!;Ü Ð!NÓOÐOØÐ ¤S¨£Z´3°u³:Ò%=Ü Ð!OÓPÐPð ˆ=Ü"ó#ä(+¨D¯L©L¸%Ó(@ô#óˆIô"¤# i£.Ó1‰MàDIÖJ¸S˜T×3Ñ3°CÕ8ÐJˆMÐJÜ! $§+¡+Ó.ˆNÜ(+¨M¸5Ó(Aò Ñ$˜Ø—k‘k 'Ñ*Ü*@Ø ¨4ô+˜wÒ'ð ô
# >Ó2ˆIá Ø×.Ñ.ذ-ð/óˆI𠈌 à ×ÑÕùò!KsÂD+cóŽ—t||d«\}}|j«}|j«|j|||¬«|S)a0
        Set new codes on MultiIndex. Defaults to returning new index.
 
        Parameters
        ----------
        codes : sequence or list of sequence
            New codes to apply.
        level : int, level name, or sequence of int/level names (default None)
            Level(s) to set (None for all levels).
        verify_integrity : bool, default True
            If True, checks that levels and codes are compatible.
 
        Returns
        -------
        new index (of same type and class...etc) or None
            The same type as the caller or None if ``inplace=True``.
 
        Examples
        --------
        >>> idx = pd.MultiIndex.from_tuples(
        ...     [(1, "one"), (1, "two"), (2, "one"), (2, "two")], names=["foo", "bar"]
        ... )
        >>> idx
        MultiIndex([(1, 'one'),
            (1, 'two'),
            (2, 'one'),
            (2, 'two')],
           names=['foo', 'bar'])
 
        >>> idx.set_codes([[1, 0, 1, 0], [0, 0, 1, 1]])
        MultiIndex([(2, 'one'),
                    (1, 'one'),
                    (2, 'two'),
                    (1, 'two')],
                   names=['foo', 'bar'])
        >>> idx.set_codes([1, 0, 1, 0], level=0)
        MultiIndex([(2, 'one'),
                    (1, 'two'),
                    (2, 'one'),
                    (1, 'two')],
                   names=['foo', 'bar'])
        >>> idx.set_codes([0, 0, 1, 1], level='bar')
        MultiIndex([(1, 'one'),
                    (1, 'one'),
                    (2, 'two'),
                    (2, 'two')],
                   names=['foo', 'bar'])
        >>> idx.set_codes([[1, 0, 1, 0], [0, 0, 1, 1]], level=[0, 1])
        MultiIndex([(2, 'one'),
                    (1, 'one'),
                    (2, 'two'),
                    (1, 'two')],
                   names=['foo', 'bar'])
        ÚCodesr)r
rÿrrŠ)r^r_r›r”r s     r`Ú    set_codeszMultiIndex.set_codesgsF€ôt)¨°°wÓ?‰ ˆˆu؏j‰j‹lˆØ ×ÑÔØ ‰u EÐ<LˆÔM؈
rbc
óê—tjtj|jDcgc]}t    |«t
j z‘Œ c}««}tj|ddd…«ddd…}tj|dddgg«jd«}|ddkDr!t|j|j|«St|j|j|«Scc}w)Nr˜rUrÚuint64é@) rZÚceilÚlog2r’r…rgÚmultiindex_nulls_shiftÚcumsumÚ concatenaterorlr_rS)r^r›ÚsizesÚlev_bitsrXs     r`Ú_enginezMultiIndex._engineªsʀô —‘Ü G‰GØKOÏ;É;ÖWÀ%”U“œh×=Ñ=Ó=ÒWó ó
ˆô—9‘9˜U¡4 R 4™[Ó)©$¨B¨$Ñ/ˆô—.‘. (¨1¨2 ,°°Ð!4Ó5×<Ñ<¸XÓFˆð A‰;˜Ò ä(¨¯©°d·j±jÀ'ÓJÐ JÜ# D§K¡K°·±¸WÓEÐEùò%Xs­#C0 có,—t|«jSr¹)ÚtyperÎrés r`Ú _constructorzMultiIndex._constructorÈs€äD‹z×%Ñ%Ð%rbcó|—|tjur|n |j}t|«j    |d|¬«S)NrÀ)rr°rtr(rÎ)r^rårsrts    r`Ú _shallow_copyzMultiIndex._shallow_copyÌs4€à¤C§N¡NÑ2‘¸¿
¹
ˆäD‹z×%Ñ% f¸ÀEÐ%ÓJÐJrbcóø—t|«|j|j|j|jd¬«}|j
j «|_|j
jdd«|S)NFr¯r’)r(r’r_rrtrˆrƒrv)r^r•s  r`rÿzMultiIndex._viewÒs`€Ø”d“Ø—;‘;Ø—*‘*Ø—n‘nØ—*‘*Ø"ô 
ˆðŸ ™ ×(Ñ(Ó*ˆŒ ؏ ‰ ×ј( DÔ)؈ rbcó²—|j|||¬«}| }d\}}|r*ddlm}||j«}||j«}||n |j}||n |j}t |«|||j |d¬«}|jj«|_|jjdd«|r|j|_    |S)    a
        Make a copy of this object.
 
        Names, dtype, levels and codes can be passed and will be set on new copy.
 
        Parameters
        ----------
        names : sequence, optional
        deep : bool, default False
        name : Label
            Kept for compatibility with 1-dimensional Index. Should not be used.
 
        Returns
        -------
        MultiIndex
 
        Notes
        -----
        In most cases, there should be no functional difference from using
        ``deep``, but if ``deep`` is passed it will attempt to deepcopy.
        This could be potentially expensive on large MultiIndex objects.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([['a'], ['b'], ['c']])
        >>> mi
        MultiIndex([('a', 'b', 'c')],
                   )
        >>> mi.copy()
        MultiIndex([('a', 'b', 'c')],
                   )
        )rsrtÚdeep©NNr)ÚdeepcopyNFr¯r’)
Ú_validate_namesrƒr0r’r_r(rrˆrvÚ_id)    r^rtr.rsÚkeep_idr’r_r0Ú    new_indexs             r`rƒzMultiIndex.copyásҀðL×$Ñ$¨$°eÀ$Ð$ÓGˆØ(ˆØ"‰ ˆá Ý %á˜dŸk™kÓ*ˆFÙ˜TŸZ™ZÓ(ˆEà!Ð-‘°4·;±;ˆØÐ*‘°·
±
ˆà”D˜“JØØØ—n‘nØØ"ô 
ˆ    ð Ÿ;™;×+Ñ+Ó-ˆ    ÔØ×Ñ×јX tÔ,Ù Ø ŸH™HˆIŒMØÐrbcó´—|dur$tjdtt«¬«|dur!t    j
|j |¬«S|j S)z%the array interface, return my valuesFaSStarting with NumPy 2.0, the behavior of the 'copy' keyword has changed and passing 'copy=False' raises an error when returning a zero-copy NumPy array is not possible. pandas will follow this behavior starting with pandas 3.0.
This conversion to NumPy requires a copy, but 'copy=False' was passed. Consider using 'np.asarray(..)' instead.©Ú
stacklevelTr¿)ÚwarningsÚwarnÚ FutureWarningr)rZr´rå)r^r“rƒs   r`Ú    __array__zMultiIndex.__array__!sO€à 5‰=ä M‰Mð2ô Ü+Ó-õ     ð 4‰<ô—8‘8˜DŸK™K¨uÔ5Ð 5؏{‰{ÐrbcóH—|j«}|j|_|S)z0this is defined as a copy with the same identity)rƒr2)r^r‘r•s   r`rzMultiIndex.view5s€à—‘“ˆØ—X‘XˆŒ
؈ rbcór—t|«    |j|«y#tttf$rYywxYw)NTF)ÚhashÚget_locÚ LookupErrorrur†©r^Úkeys  r`Ú __contains__zMultiIndex.__contains__;s6€ä ˆSŒ    ð    Ø L‰L˜Ô ØøÜœY¬
Ð3ò    Ùð    ús Ÿ6µ6có,—tjd«S)NÚO)rZr“rés r`r“zMultiIndex.dtypeDs€äx‰x˜‹}ÐrbcóH‡—dd„Štˆfd„|jD««S)z5return a boolean if we need a qualified .info displaycóT—t|«xst|«xr|jdk(S)NÚpython)r1r3Ústorager¿s r`Úfz0MultiIndex._is_memory_usage_qualified.<locals>.fKs*€Ü" 5Ó)òÜ Ó&ÒD¨5¯=©=¸HÑ+Dð rbc3óB•K—|]}‰|j«–—Œy­wr¹r¿)r¼r›rJs  €r`r¾z8MultiIndex._is_memory_usage_qualified.<locals>.<genexpr>Psøèø€Ò; e‘1U—[‘[—>Ñ;ùóƒ©ÚreturnÚbool)r™r’)r^rJs @r`Ú_is_memory_usage_qualifiedz%MultiIndex._is_memory_usage_qualifiedHsø€ó    ô
Ó;¨t¯{©{Ô;Ó;Ð;rbcó$—|j|«Sr¹©Ú_nbytes)r^r.s  r`Ú memory_usagezMultiIndex.memory_usageSs€ð
|‰|˜DÓ!Ð!rbcó$—|jd«S)z1return the number of bytes in the underlying dataFrRrés r`ÚnbyteszMultiIndex.nbytesZs€ð|‰|˜EÓ"Ð"rbcó ‡‡—dŠtˆfd„|jD««}td„|jD««}tˆfd„|jD««}||z|z}||jj ‰¬«z }|S)zÇ
        return the number of bytes in the underlying data
        deeply introspect the level data if deep=True
 
        include the engine hashtable
 
        *this is in internal routine*
 
        éc3óB•K—|]}|j‰¬«–—Œy­w)©r.N)rT)r¼rªr.s  €r`r¾z%MultiIndex._nbytes.<locals>.<genexpr>lsøèø€ÒJ¸˜1Ÿ>™>¨t˜>×4ÑJùrLc3ó4K—|]}|j–—Œy­wr¹)rV)r¼rªs  r`r¾z%MultiIndex._nbytes.<locals>.<genexpr>msèø€Ò8¨˜1Ÿ88Ñ8ùó‚c3ó6•K—|]}t|‰«–—Œy­wr¹r
)r¼rªÚobjsizes  €r`r¾z%MultiIndex._nbytes.<locals>.<genexpr>nsøèø€ÒE°Qœ9 Q¨×0ÑEùsƒrZ)Úsumr’r_rtr&Úsizeof)r^r.Ú level_nbytesÚ label_nbytesÚ names_nbytesr•r^s `    @r`rSzMultiIndex._nbytes_sxù€ðˆäÓJ¸d¿k¹kÔJÓJˆ ÜÑ8¨T¯Z©ZÔ8Ó8ˆ ÜÓE¸$¿*¹*ÔEÓEˆ Ø  Ñ,¨|Ñ;ˆð    $—,‘,×%Ñ%¨4Ð%Ó0Ñ0ˆØˆ rbcóŠ—|jDcgc]}|j‘Œ}}td„t||«D««Scc}w)zW
        Formats each item in tup according to its level's formatter function.
        c3ó2K—|]\}}||«–—Œy­wr¹rj)r¼ÚfuncÚvals   r`r¾z-MultiIndex._formatter_func.<locals>.<genexpr>}sèø€ÒJ¡9 4¨‘T˜#—YÑJùr)r’Ú_formatter_funcr»rË)r^Útupr›Úformatter_funcss    r`rhzMultiIndex._formatter_funcxs@€ð?C¿k¹kÖJ°U˜5×0Ó0ÐJˆÐJÜÑJ´°OÀSÓ0IÔJÓJÐJùòKsAÚnan)Úna_repc óŽ—g}g}t|j|j«D]³\}}|jdd|i|¤Ž}|dk(}|j    «rct |«}    |j t«}tj||«}|jjrJ‚|j«}|    ||<|j|«|j|«Œµt |«dk(r.t|dj|d««j«St|||j |j"d¬«}
|
j$S)Nrlr˜rUrF©r’r_rtrr”rj)rËr’r_Ú_get_values_for_csvr™r…roÚstrrZr§ÚflagsÚ    writeablerƒrBÚtakerOrtrrÇ) r^rlryrr–r›r«Ú
level_strsÚmaskÚ    nan_indexÚmis            r`rozMultiIndex._get_values_for_csvs6€ðˆ
؈    ô#& d§k¡k°4·:±:Ó">ò     *Ñ ˆE;Ø2˜×2Ñ2ÑK¸&ÐKÀFÑKˆJà "Ñ$ˆD؏x‰xŒzÜ 
›O    à'×.Ñ.¬sÓ3
ÜŸY™Y z°6Ó:
Ø&×,Ñ,×6Ò6Ð6Ð6Ø)×.Ñ.Ó0 Ø$- ˜DÑ!Ø × Ñ ˜jÔ )Ø × Ñ ˜[Õ )ð     *ô ˆz‹?˜aÒ ä˜ A™×+Ñ+¨I°a©LÓ9Ó:×NÑNÓPÐ PôØ!ØØ—j‘jØŸ.™.Ø!&ô ˆBð—:‘:Ð rbc    óæ—tjt|«j›dtt «¬«||}t |«dk(rgSg}t|j|j«D]é\}    }
||nt|    j«} t |    «dkDrg|    j|
«j|¬«} |
dk(} | j«rvtj | t"¬«} | | | <| j%«} nEt'j(|    j*|
«Dcgc]}t-t/|«r| n|d¬«‘Œ} }|j1| «Œëg}t||j2«D]d\}    }g}|r |j1| t-|d¬«nd    «|j5tj |    t"¬««|j1|«Œf|€ t7d
«}|rSd    }t9|t:«s|t<j>usJ‚|d t<j>fvr|}tA|tC|«|¬ «}|r,tE«}|jF|g|¢­ŽjId «S|Scc}w)Nz.format is deprecated and will be removed in a future version. Convert using index.astype(str) or index.map(formatter) instead.r6r©Ú    formatterr˜r¿©ú    ú ú
©Ú escape_charsÚúdisplay.multi_sparseF©ÚstartÚsentinelr~)%r8r9r(rcr:r)r…rËr’r_Ú _get_na_repr“rsÚformatr™rZr´rnÚtolistrrârÇrKr;r§rtÚextendrrºrOrr°Úsparsify_labelsrŒrJÚadjoinÚsplit)r^rsrzrlrtÚspaceÚsparsifyr‹Ústringified_levelsrr«ÚnaÚ    formattedrurúÚ result_levelsÚlev_namer›r…Úadjs                    r`r‡zMultiIndex.format£sS€ô     ‰ äD‹z×"Ñ"Ð#ð$,ð ,ô Ü'Ó)õ     
ð Р؈Eä ˆt‹9˜Š>؈IàÐÜ # D§K¡K°·±Ó <ò    1Ñ ˆCØ!Ð-‘´;¸s¿y¹yÓ3IˆBä3‹x˜!Š|ØŸH™H [Ó1×8Ñ8À9Ð8ÓM    ð# bÑ(Ø—8‘8”:Ü "§¡¨¼&Ô AIØ&(I˜d‘OØ )× 0Ñ 0Ó 2‘Iô #Ÿ]™]¨3¯;©;¸ ÓDöàô!¤t¨A¤w¡°AÐDVÖW𐠠  ðð × %Ñ % iÕ 0ð'    1ð*ˆ Ü Ð!3°T·Z±ZÓ@ò     (‰MˆCØˆEáØ— ‘ àÐ+ô! Ð8JÕKàôð L‰LœŸ™ #¬VÔ4Ô 5Ø ×  Ñ   Õ 'ð     (ð Ð Ü!Ð"8Ó9ˆHá Ø;=ˆHä˜h¬Ô-°¼S¿^¹^Ñ1KÐ KÐKؘE¤3§>¡>Ð2Ñ2Ø#ä+ؤS¨£Z¸(ôˆMñ Ü Ó"ˆCؐ3—:‘:˜eÐ4 mÒ4×:Ñ:¸4Ó@Ð @à Ð  ùòMsÄ'!I.ryc    ó —t|«dk(rgSg}t|j|j«D]ê\}}t    |j
«}t|«dkDrl|j |«x}}    |jd|¬«}    |dk(}
|
j«rvtj|    t¬«}    ||    |
<|    j«}    nEtj|j|«D cgc]} t!t#| «r|n| d¬«‘Œ}    } |j%|    «Œìg} t||j&«D]d\}} g}|r |j%|  t!| d¬«nd«|j)tj|t¬««| j%|«Œf|€ t+d    «}|rQd}t-|t.«s|t0j2usJ‚|t0j2ur|}t5| t7|«|¬
«} | Scc} w) NrF)Ú include_namerzr˜r¿r{rrr‚rƒ)r…rËr’r_r†r“rsÚ _format_flatr™rZr´rnrˆrrârÇrKr;r§rtr‰rrºrOrr°rŠrŒ)r^Ú include_namesrŽrzrrr«rÚtakenr‘rurúr’r“r›r…s                r`Ú _format_multizMultiIndex._format_multiôsê€ô ˆt‹9˜Š>؈IàÐÜ # D§K¡K°·±Ó <ò    1Ñ ˆCÜ˜SŸY™YÓ'ˆBä3‹x˜!Š|Ø$'§H¡H¨[Ó$9Ð9˜    Ø!×.Ñ.¸EÈYÐ.ÓW    ð# bÑ(Ø—8‘8”:Ü "§¡¨¼&Ô AIØ&(I˜d‘OØ )× 0Ñ 0Ó 2‘Iô #Ÿ]™]¨3¯;©;¸ ÓDöàô!¤t¨A¤w¡°AÐDVÖW𐠠  ðð × %Ñ % iÕ 0ð)    1ð,ˆ Ü Ð!3°T·Z±ZÓ@ò     (‰MˆCØˆEáØ— ‘ àÐ+ô! Ð8JÕKàôð L‰LœŸ™ #¬VÔ4Ô 5Ø ×  Ñ   Õ 'ð     (ð Ð Ü!Ð"8Ó9ˆHá Ø;=ˆHä˜h¬Ô-°¼S¿^¹^Ñ1KÐ KÐKØœ3Ÿ>™>Ñ)Ø#ä+ؤS¨Ó%7À(ôˆMðÐùòEsÃ*!Hcó,—t|j«Sr¹)rFrrés r`Ú
_get_nameszMultiIndex._get_names6s€Ü˜$Ÿ+™+Ó&Ð&rb)r›r„có—|t|«s td«‚t|«}|rI|"t|«t|«k7r td«‚|€#t|«|jk7r td«‚|€t |j«}n|Dcgc]}|j |«‘Œ}}t||«D]B\}}|,t|«s!tt|«j›d«‚||j|<ŒD|j«ycc}w)aö
        Set new names on index. Each name has to be a hashable type.
 
        Parameters
        ----------
        values : str or sequence
            name(s) to set
        level : int, level name, or sequence of int/level names (default None)
            If the index is a MultiIndex (hierarchical), level(s) to set (None
            for all levels).  Otherwise level must be None
        validate : bool, default True
            validate that the names match level lengths
 
        Raises
        ------
        TypeError if each name is not hashable.
 
        Notes
        -----
        sets names on levels. WARNING: mutates!
 
        Note that you generally want to set this *after* changing levels, so
        that it only acts on copies
        Nz*Names should be list-like for a MultiIndexz+Length of names must match length of level.z:Length of names must match number of levels in MultiIndex.z.name must be a hashable type)r0r†r¤r…r¦r rrËr-rur(rcrr)r^rtr›r„rrss      r`r‹zMultiIndex._set_names9s€ð6 Ð ¤\°%Ô%8ÜÐIÓJÐ JܐU“ ˆá ØÐ ¤S¨£Z´3°u³:Ò%=Ü Ð!NÓOÐO؈}¤ U£¨t¯|©|Ò!;Ü ØPóðð ˆ=ܘ$Ÿ,™,Ó'‰Eà<AÖB°ST×+Ñ+¨CÕ0ÐBˆEÐBô˜U EÓ*ò    $‰IˆCØÐô# 4Ô(Ü#Ü ›:×.Ñ.Ð/Ð/LÐMóðð $ˆDK‰K˜Ò ð    $ð     ×ÑÕùòCs Dam
        Names of levels in MultiIndex.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays(
        ... [[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z'])
        >>> mi
        MultiIndex([(1, 3, 5),
                    (2, 4, 6)],
                   names=['x', 'y', 'z'])
        >>> mi.names
        FrozenList(['x', 'y', 'z'])
        )ÚfsetÚfgetr(có—y)NÚmixedrjrés r`Ú inferred_typezMultiIndex.inferred_typeˆs€àrbcóü—|jj|«}|dkDrt|«std|›d«‚    |jj    |«}|S#t$r™}t|«st d|›d«|‚|dkr@||j z }|dkrZ||j z
}td|j ›d|›d    «|‚||j k\rtd|j ›d
|dz›«|‚Yd}~|Sd}~wwxYw) NrUz    The name z* occurs multiple times, use a level numberzLevel z
 not foundrz Too many levels: Index has only z     levels, z is not a valid level numberz  levels, not )rtÚcountr.r†rÚKeyErrorr¦Ú
IndexError)r^r›r¤ÚerrÚ
orig_levels     r`rzMultiIndex._get_level_numberŒs,€Ø—
‘
× Ñ  Ó'ˆØ AŠIœz¨%Ô0ÜØ˜E˜7Ð"LÐMóð ð    Ø—J‘J×$Ñ$ UÓ+ˆEð$ˆ øô#ò    Ü˜eÔ$Ü ¨ w¨jÐ9Ó:ÀÐCؐqŠyؘŸ™Ñ%Ø˜1’9Ø!&¨¯©Ñ!5JÜ$Ø:¸4¿<¹<¸.È    Ø%˜,Ð&BðDóððð
˜$Ÿ,™,Ò&Ü Ø6°t·|±|°nðEØ  1™9˜+ð'óððûðˆ ûð#    ús¼AÁ    C;Á"BC6Ã6C;c    óP—td„|jD««rytd„|jD««r>t    j
|jDcgc]}|j dd¬«‘Œc}«Sttt|j«««Dcgc]}|j|«j‘Œ}}    tj|«}t|«jScc}wcc}w#t $r"t|j«jcYSwxYw)zI
        Return a boolean if the values are equal or increasing.
        c3ó$K—|]}d|v–—Œ
y­w)r˜Nrj)r¼rœs  r`r¾z5MultiIndex.is_monotonic_increasing.<locals>.<genexpr>¬sèø€Ò1˜dˆrTŒzÑ1ùs‚Fc3ó4K—|]}|j–—Œy­wr¹©Úis_monotonic_increasing)r¼r›s  r`r¾z5MultiIndex.is_monotonic_increasing.<locals>.<genexpr>¯sèø€ÒF°ˆu×,Õ,ÑFùr\Úint64rþ)r™r_rÁr’ÚlibalgosÚ is_lexsortedroÚreversedr r…Ú_get_level_valuesrÇrZÚlexsortrBr­ru)r^rúrªråÚ
sort_orders     r`r­z"MultiIndex.is_monotonic_increasing§sõ€ô
Ñ1 d§j¡jÔ1Ô 1Øä ÑF¸$¿+¹+ÔFÔ Fä×(Ñ(Ø8<¿
¹
ÖC°1—‘˜'¨Õ.ÒCóð ô 8@ÄÄcÈ$Ï+É+ÓFVÓ@WÓ7Xö
Ø23ˆD× "Ñ " 1Ó %× -Ó -ð
ˆð
ð     ?ôŸ™ FÓ+ˆJܘÓ$×<Ñ<Ð <ùòDùò
øôò    ?䘟™Ó&×>Ñ>Ò >ð    ?úsÁC0Â!"C5Ã)C:Ã:(D%Ä$D%có&—|ddd…jS)zI
        Return a boolean if the values are equal or decreasing.
        Nr˜r¬rés r`Úis_monotonic_decreasingz"MultiIndex.is_monotonic_decreasingÆs€ð ‘DbD‰z×1Ñ1Ð1rbcóT—|jDcgc]}|j‘Œc}Scc}w)z7return a list of the inferred types, one for each level)r’r¢)r^rªs  r`Ú_inferred_type_levelsz MultiIndex._inferred_type_levelsÎs €ð*.¯©Ö5 A—“Ò5Ð5ùÒ5s%có„—td„|jD««}t|j|dd¬«}t    ||«S)Nc3ó2K—|]}t|«–—Œy­wr¹ró)r¼rs  r`r¾z(MultiIndex.duplicated.<locals>.<genexpr>Õsèø€Ò6 3”c˜#—hÑ6ùrF)ÚsortÚxnull)r»r’rHr_r)r^ÚkeepÚshapeÚidss    r`rzMultiIndex.duplicatedÓs7€äÑ6¨$¯+©+Ô6Ó6ˆÜ˜dŸj™j¨%°eÀ5ÔIˆä˜#˜tÓ$Ð$rbcó—td«‚)z:
        fillna is not implemented for MultiIndex
        z"isna is not defined for MultiIndex)ÚNotImplementedError)r^ÚvalueÚdowncasts   r`ÚfillnazMultiIndex.fillnaÞs€ô"Ð"FÓGÐGrbcó<—|jDcgc]}|dk(‘Œ    }}|dk(rtj|d¬«}n+|dk(rtj|d¬«}nt    d|›«‚|jDcgc]}||‘Œ
}}|j |¬«Scc}wcc}w)Nr˜r™rrVrÁzinvalid how option: )r_)r_rZr™rÁr†r)r^Úhowr«ÚnansÚindexerr–s      r`ÚdropnazMultiIndex.dropnaäsš€à59·Z±ZÖ@ k ˜rÓ!Ð@ˆÐ@Ø %Š<Ü—f‘f˜T¨Ô*‰GØ EŠ\Ü—f‘f˜T¨Ô*‰GäÐ3°C°5Ð9Ó:Ð :à>B¿j¹jÖI¨{[ ' Ó*ÐIˆ    ÐI؏~‰~ Iˆ~Ó.Ð.ùòAùòJs  BÁ3 Bcó—|j|}|j|}|j|}|rtj|«}tj
|j ||j¬«}|j||¬«S)aP
        Return vector of label values for requested level,
        equal to the length of the index
 
        **this is an internal method**
 
        Parameters
        ----------
        level : int
        unique : bool, default False
            if True, drop duplicated values
 
        Returns
        -------
        Index
        rÝrö)    r’r_rrÚuniquerârÇrãr+)r^r›rËrr«rsÚfilleds       r`r²zMultiIndex._get_level_valuesñso€ð"k‰k˜%Ñ ˆØ—j‘j Ñ'ˆ ؏{‰{˜5Ñ!ˆÙ ÜŸ,™, {Ó3ˆKÜ—‘˜sŸ{™{¨KÀCÇMÁMÔRˆØ× Ñ  ¨dРÓ3Ð3rbcóJ—|j|«}|j|«}|S)a(
        Return vector of label values for requested level.
 
        Length of returned vector is equal to the length of the index.
 
        Parameters
        ----------
        level : int or str
            ``level`` is either the integer position of the level in the
            MultiIndex, or the name of the level.
 
        Returns
        -------
        Index
            Values is a level of this MultiIndex converted to
            a single :class:`Index` (or subclass thereof).
 
        Notes
        -----
        If the level contains missing values, the result may be casted to
        ``float`` with missing values specified as ``NaN``. This is because
        the level is converted to a regular ``Index``.
 
        Examples
        --------
        Create a MultiIndex:
 
        >>> mi = pd.MultiIndex.from_arrays((list('abc'), list('def')))
        >>> mi.names = ['level_1', 'level_2']
 
        Get level values by supplying level as either integer or name:
 
        >>> mi.get_level_values(0)
        Index(['a', 'b', 'c'], dtype='object', name='level_1')
        >>> mi.get_level_values('level_2')
        Index(['d', 'e', 'f'], dtype='object', name='level_2')
 
        If a level contains missing values, the return type of the level
        may be cast to ``float``.
 
        >>> pd.MultiIndex.from_arrays([[1, None, 2], [3, 4, 5]]).dtypes
        level_0    int64
        level_1    int64
        dtype: object
        >>> pd.MultiIndex.from_arrays([[1, None, 2], [3, 4, 5]]).get_level_values(0)
        Index([1.0, nan, 2.0], dtype='float64')
        )rr²)r^r›rås   r`Úget_level_valueszMultiIndex.get_level_values s*€ð`×&Ñ& uÓ-ˆØ×'Ñ'¨Ó.ˆØˆ rbcón—|€|j«S|j|«}|j|d¬«S)NT)r›rË)Údrop_duplicatesrr²)r^r›s  r`rËzMultiIndex.unique?s<€à ˆ=Ø×'Ñ'Ó)Ð )à×*Ñ*¨5Ó1ˆEØ×)Ñ)°¸dÐ)ÓCÐ Crbc    óì—ddlm}|tjurEt    |«s t d«‚t |«t |j«k7r td«‚|}n|j«}|s+t t|««t |«k7r td«‚|tt |j««Dcic]}||j|«“Œc}d¬«}||_ |r||_|Scc}w)a$
        Create a DataFrame with the levels of the MultiIndex as columns.
 
        Column ordering is determined by the DataFrame constructor with data as
        a dict.
 
        Parameters
        ----------
        index : bool, default True
            Set the index of the returned DataFrame as the original MultiIndex.
 
        name : list / sequence of str, optional
            The passed names should substitute index level names.
 
        allow_duplicates : bool, optional default False
            Allow duplicate column labels to be created.
 
            .. versionadded:: 1.5.0
 
        Returns
        -------
        DataFrame
 
        See Also
        --------
        DataFrame : Two-dimensional, size-mutable, potentially heterogeneous
            tabular data.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([['a', 'b'], ['c', 'd']])
        >>> mi
        MultiIndex([('a', 'c'),
                    ('b', 'd')],
                   )
 
        >>> df = mi.to_frame()
        >>> df
             0  1
        a c  a  c
        b d  b  d
 
        >>> df = mi.to_frame(index=False)
        >>> df
           0  1
        0  a  c
        1  b  d
 
        >>> df = mi.to_frame(name=['x', 'y'])
        >>> df
             x  y
        a c  a  c
        b d  b  d
        r)rMz1'name' must be a list / sequence of column names.z<'name' should have same length as number of levels on index.zBCannot create duplicate column labels if allow_duplicates is FalseFrþ)rìrMrr°r0rur…r’r†Ú_get_level_namesÚsetr r²rÙr)r^rrsÚallow_duplicatesrMÚ    idx_namesr›r•s        r`Úto_framezMultiIndex.to_frameGsâ€õx    %à ”s—~‘~Ñ %Ü Ô%ÜРSÓTÐTä4‹yœC § ¡ Ó,Ò,Ü ØRóðð‰Ià×-Ñ-Ó/ˆIá¤C¬¨I«Ó$7¼3¸y»>Ò$IÜØTóð ñ
Ü?DÄSÈÏÉÓEUÓ?VÖ W°eˆUD×*Ñ*¨5Ó1Ñ 1Ò WØô
ˆð#ˆŒá ؈FŒL؈ ùò XsÂ=C1có0—t|jd¬«S)a
        Convert a MultiIndex to an Index of Tuples containing the level values.
 
        Returns
        -------
        pd.Index
            Index with the MultiIndex data represented in Tuples.
 
        See Also
        --------
        MultiIndex.from_tuples : Convert flat index back to MultiIndex.
 
        Notes
        -----
        This method will simply return the caller if called by anything other
        than a MultiIndex.
 
        Examples
        --------
        >>> index = pd.MultiIndex.from_product(
        ...     [['foo', 'bar'], ['baz', 'qux']],
        ...     names=['a', 'b'])
        >>> index.to_flat_index()
        Index([('foo', 'baz'), ('foo', 'qux'),
               ('bar', 'baz'), ('bar', 'qux')],
              dtype='object')
        F)Ú tupleize_cols)rBrÇrés r`Ú to_flat_indexzMultiIndex.to_flat_index£s€ô8T—\‘\°Ô7Ð7rbcó4—|j|jk(S)a´
        Return True if the codes are lexicographically sorted.
 
        Returns
        -------
        bool
 
        Examples
        --------
        In the below examples, the first level of the MultiIndex is sorted because
        a<b<c, so there is no need to look at the next level.
 
        >>> pd.MultiIndex.from_arrays([['a', 'b', 'c'],
        ...                            ['d', 'e', 'f']])._is_lexsorted()
        True
        >>> pd.MultiIndex.from_arrays([['a', 'b', 'c'],
        ...                            ['d', 'f', 'e']])._is_lexsorted()
        True
 
        In case there is a tie, the lexicographical sorting looks
        at the next level of the MultiIndex.
 
        >>> pd.MultiIndex.from_arrays([[0, 1, 1], ['a', 'b', 'c']])._is_lexsorted()
        True
        >>> pd.MultiIndex.from_arrays([[0, 1, 1], ['a', 'c', 'b']])._is_lexsorted()
        False
        >>> pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'],
        ...                            ['aa', 'bb', 'aa', 'bb']])._is_lexsorted()
        True
        >>> pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'],
        ...                            ['bb', 'aa', 'aa', 'bb']])._is_lexsorted()
        False
        )r¥r¦rés r`Ú _is_lexsortedzMultiIndex._is_lexsortedÁs€ðD×"Ñ" d§l¡lÑ2Ð2rbcór—|j |jSt|j|j«S)z­
        Compute and return the lexsort_depth, the number of levels of the
        MultiIndex that are sorted lexically
 
        Returns
        -------
        int
        )rr¥r_r¦rés r`r¥zMultiIndex._lexsort_depthås-€ð >‰>Ð %Ø—>‘>Ð !ܘdŸj™j¨$¯,©,Ó7Ð7rbcó&—|j«r|jr|Sg}g}t|j|j«D]—\}}|jsd    |j «}|j |«}t|«}tj|t|««}tj||d¬«}|j|«|j|«Œ™t|||j |j"d¬«S#t$r|r‚YŒVwxYw)aÖ
        This is an *internal* function.
 
        Create a new MultiIndex from the current to monotonically sorted
        items IN the levels. This does not actually make the entire MultiIndex
        monotonic, JUST the levels.
 
        The resulting MultiIndex will have the same outward
        appearance, meaning the same .values and ordering. It will also
        be .equals() to the original.
 
        Returns
        -------
        MultiIndex
 
        Examples
        --------
        >>> mi = pd.MultiIndex(levels=[['a', 'b'], ['bb', 'aa']],
        ...                    codes=[[0, 0, 1, 1], [0, 1, 0, 1]])
        >>> mi
        MultiIndex([('a', 'bb'),
                    ('a', 'aa'),
                    ('b', 'bb'),
                    ('b', 'aa')],
                   )
 
        >>> mi.sort_values()
        MultiIndex([('a', 'aa'),
                    ('a', 'bb'),
                    ('b', 'aa'),
                    ('b', 'bb')],
                   )
        r˜rÝF)rtrr”)rÛr­rËr’r_Úargsortrsr,rÚget_reverse_indexerr…rrârur§rOrtr)r^Úraise_if_incomparablerr–rr«rÈÚris        r`Ú_sort_levels_monotonicz!MultiIndex._sort_levels_monotonicós€ðD × Ñ Ô  D×$@Ò$@؈Kàˆ
؈    ä # D§K¡K°·±Ó <ò    *Ñ ˆCØ×.Ò.ð Pà!Ÿk™k›mGð
Ÿ(™( 7Ó+Cô2°'Ó:GÜ×0Ñ0°¼#¸g»,ÓGBÜ"'§-¡-°°KÈBÔ"OKà × Ñ ˜cÔ "Ø × Ñ ˜[Õ )ð#    *ô&Ø Ø Ø—*‘*Ø—n‘nØ"ô 
ð    
øô!òÙ,Øñ-ðúsÁDÄ DÄDcóÈ—g}g}d}t|j|j«D]o\}}tjtj
|dz«dkD«ddz
}t t|«xr|ddk(«}t|«t|«|zk7rÛ|j«j«rt|«t|«k(rnÉd}tj|«}|r-tj|dk(«d}||ddg|d|dg<tjt|«|z«}    tjt|««|z
|    |<|    |}|j||d«}|j|«|j|«Œr|j!«}
|r6|
j#«|
j%|d¬«|
j'|d¬«|
S)a¤
        Create new MultiIndex from current that removes unused levels.
 
        Unused level(s) means levels that are not expressed in the
        labels. The resulting MultiIndex will have the same outward
        appearance, meaning the same .values and ordering. It will
        also be .equals() to the original.
 
        Returns
        -------
        MultiIndex
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_product([range(2), list('ab')])
        >>> mi
        MultiIndex([(0, 'a'),
                    (0, 'b'),
                    (1, 'a'),
                    (1, 'b')],
                   )
 
        >>> mi[2:]
        MultiIndex([(1, 'a'),
                    (1, 'b')],
                   )
 
        The 0 from the first level is not represented
        and can be removed
 
        >>> mi2 = mi[2:].remove_unused_levels()
        >>> mi2.levels
        FrozenList([[1], ['a', 'b']])
        FrUrr˜TN©r„)rËr’r_rZršÚbincountrŒr…r;r™rrËrÂÚarangersr§rrr‰rŠ) r^rr–Úchangedrr«ÚuniquesÚhas_naÚna_idxÚ code_mappingr•s            r`Úremove_unused_levelszMultiIndex.remove_unused_levels6s¿€ðFˆ
؈    àˆÜ # D§K¡K°·±Ó <ó#    *Ñ ˆCô—h‘hœrŸ{™{¨;¸©?Ó;¸aÑ?Ó@ÀÑCÀaÑGˆGÜœ˜W›Ò<¨7°1©:¸Ñ+;Ó=ˆFä7‹|œs 3›x¨&Ñ0Ò0Ø—8‘8“:—>‘>Ô#¬¨G« ¼¸C»Ò(@Ùàô  Ÿ,™, {Ó3ÙÜŸX™X g°¡mÓ4°QÑ7Fà.5°v¸a±yÀ!°nÑ.EG˜Q  q¡    ˜NÑ+ô "Ÿx™x¬¨C«°6Ñ(9Ó: ä(*¯    ©    ´#°g³,Ó(?À&Ñ(H ˜WÑ%à*¨;Ñ7 ð—h‘h˜w v wÐ/Ó0à × Ñ ˜cÔ "Ø × Ñ ˜[Ö )ðG#    *ðJ—‘“ˆá Ø × "Ñ "Ô $Ø × Ñ ˜z°EÐ Ô :Ø × Ñ ˜i°%Ð Ô 8àˆ rbcóҗt|j«t|j«|jt|j«dœ}t
j t|«|fdfS)z*Necessary for making this object picklable)r’r_rrtN)r¤r’r_rrtÚibaseÚ
_new_Indexr()r^Úds  r`Ú
__reduce__zMultiIndex.__reduce__ŽsS€ô˜4Ÿ;™;Ó'ܘ$Ÿ*™*Ó%ØŸ™Ü˜$Ÿ*™*Ó%ñ    
ˆô ×Ѥ$ t£*¨a °$Ð6Ð6rbcóì—t|«r‰tj|«}g}t|j|j
«D]D\}}||dk(r |j tj«Œ.|j |||«ŒFt|«Sd}tj|«r(tj|t¬«}|j}n]t|t«r(|j |j dkDr2|j}n%t|t"«rtj|«}|j
Dcgc]}||‘Œ    }}t%|j||j&|d¬«Scc}w)Nr˜r¿rFrn)r2rÃÚcast_scalar_indexerrËr’r_r§rZrkr»Úis_bool_indexerrÆrOrrºÚsliceÚsteprBrOrt)r^rBÚretvalrr«rr–s       r`Ú __getitem__zMultiIndex.__getitem__šs2€Ü SŒ>Ü×)Ñ)¨#Ó.ˆCàˆFÜ$'¨¯ © °T·Z±ZÓ$@ò 9Ñ [ؘsÑ# rÒ)Ø—M‘M¤"§&¡&Õ)à—M‘M # k°#Ñ&6Ñ"7Õ8ð     9ô ˜“=Ð  ðˆIÜ×"Ñ" 3Ô'Ü—j‘j ¬DÔ1Ø ŸN™N‘    Ü˜C¤Ô'Ø—8‘8Ð# s§x¡x°!¢|Ø $§¡‘IܘC¤Ô'Ü—j‘j “oà=A¿Z¹ZÖH¨k˜ SÓ)ÐHˆIÐH䨗{‘{ØØ—j‘jØ#Ø!&ô ð ùòIsÄ? E1cóê—d}|j|jdkDr |j}|jDcgc]}||‘Œ    }}t|«|j||j
|d¬«Scc}w)zH
        Fastpath for __getitem__ when we know we have a slice.
        NrFrn)rörr_r(r’r)r^Úslobjrr«r–s     r`Ú_getitem_slicezMultiIndex._getitem_slice¼sr€ðˆ    Ø :‰:Ð  §¡¨a¢ØŸ™ˆIà;?¿:¹:ÖF¨K[ Ó'ÐFˆ    ÐFàŒtD‹zØ—;‘;ØØ—+‘+ØØ"ô 
ð    
ùòGs¸ A0rsc ó¨—tjd|«t|«}|j|||«}d}|jDcgc]}|j |«‘Œ}}|rK|dk(}    |    j «r6g}
|D]-} | } || |    <|
jtj| ««Œ/|
}t|j||jd¬«Scc}w)Nrjr˜F©r’r_rtr”) ÚnvÚ validate_taker,Ú_maybe_disallow_fillr_rsr™r§rZrÆrOr’rt) r^ÚindicesrWÚ
allow_fillrÞryÚna_valueÚlabr™ruÚmaskedÚ    new_labelÚ label_valuess              r`rszMultiIndex.takeÎsрô     ×ј˜VÔ$Ü% gÓ.ˆð×.Ñ.¨z¸:ÀwÓOˆ
àˆà.2¯j©jÖ9 s—‘˜'Õ"Ð9ˆÐ9٠ؘb‘=ˆD؏x‰xŒzؐØ!&ò<IØ#,LØ)1L Ñ&Ø—M‘M¤"§*¡*¨\Ó":Õ;ð<ðäØ—;‘; e°4·:±:ÐPUô
ð    
ùò:sÁCc
óT‡‡
‡ —t|ttf«s|g}tˆfd„|D««rg}g}g}t    ‰j
«D]ۊ
‰j ‰
}|D] }|j|j ‰
«}Œ"‰g|¢Dcgc]+}t|j‰
|j ‰
|d¬«‘Œ-}}‰j‰
Š tˆ
ˆ fd„|D««rdŠ |jtj|««|j|«|j‰ «ŒÝt|||d¬«S‰j ftd„|D««z}tj|«}        tj#|    «Scc}w#t$t&f$rt)|    «cYSwxYw)aä
        Append a collection of Index options together.
 
        Parameters
        ----------
        other : Index or list/tuple of indices
 
        Returns
        -------
        Index
            The combined index.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([['a'], ['b']])
        >>> mi
        MultiIndex([('a', 'b')],
                   )
        >>> mi.append(mi)
        MultiIndex([('a', 'b'), ('a', 'b')],
                   )
        c3ót•K—|]/}t|t«xr|j‰jk\–—Œ1y­wr¹)rºrOr¦)r¼Úor^s  €r`r¾z$MultiIndex.append.<locals>.<genexpr>    s2øèø€ò
ØJKŒZ˜œ:Ó &Ò D¨1¯9©9¸¿ ¹ Ñ+DÓ Dñ
ùsƒ58Frþc3óB•K—|]}|j‰‰k7–—Œy­wr¹©rt)r¼rwrªÚ
level_names  €€r`r¾z$MultiIndex.append.<locals>.<genexpr>    søèø€ÒA°Rr—x‘x ‘{ jÕ0ÑAùrLN)r_r’rtr”c3ó4K—|]}|j–—Œy­wr¹rè©r¼Úks  r`r¾z$MultiIndex.append.<locals>.<genexpr>"    sèø€Ò+E¸!¨A¯I­IÑ+Eùr\)rºr¤r»rÁr r¦r’Úunionr@r_rtr™r§rZr#rOrÇrÎrur¦rB) r^Úotherr_r’rtÚ level_valuesrwr«Ú    to_concatÚ
new_tuplesrªr s `         @@r`r§zMultiIndex.appendîs£ú€ô.˜%¤$¬ Ô/ؐGˆEä ó
ØOTô
õ
ðˆE؈F؈Eܘ4Ÿ<™<Ó(ò )Ø#Ÿ{™{¨1™~ ØòDBØ#/×#5Ñ#5°b·i±iÀ±lÓ#C‘LðDð !%˜~ u˜~ö    ðô*ØŸ™ ™  R§Y¡Y¨q¡\°<Àeöð ðð "ŸZ™Z¨™]
ÜÔA¸5ÔAÔAØ!%JØ— ‘ œRŸ^™^¨KÓ8Ô9Ø— ‘ ˜lÔ+Ø— ‘ ˜ZÕ(ð )ô Ø F°%È%ôð ð—\‘\O¤eÑ+E¸uÔ+EÓ&EÑEˆ    Ü—^‘^ IÓ.ˆ
ð    %ô×)Ñ)¨*Ó5Ð 5ùò/øô0œ:Ð&ò    %ܘÓ$Ò $ð    %ús 0FÅ0F
Æ
F'Æ&F'Úlast)Ú na_positioncóš—|jd¬«}|j«Dcgc]}|j‘Œ}}t||d¬«Scc}w)NT)rà)rÚ codes_given)râÚ_get_codes_for_sortingr_rI)r^rrxryÚtargetrÚkeyss       r`rÞzMultiIndex.argsort-    sL€ð×,Ñ,À4Ð,ÓHˆØ%+×%BÑ%BÓ%DÖE˜c—    “    ÐEˆÐEܘt°È$ÔOÐOùòFs¥AÚrepeatc
ót—tjdd|i«t|«}t|j|j
Dcgc]O}|j tj«jtjd¬«j|«‘ŒQc}|j|jd¬«Scc}w)NrjrWFrþrn)rþÚvalidate_repeatr,rOr’r_rrZrÅroÚintprrtr)r^ÚrepeatsrWr«s    r`rzMultiIndex.repeat4    s™€ä
×ј2 ¨˜~Ô.ô& gÓ.ˆÜØ—;‘;ð$(§:¡:öàð× Ñ ¤§¡Ó,×3Ñ3´B·G±GÀ%Ð3ÓH×OÑOÐPWÕXòð—*‘*Ø—n‘nØ"ô    
ð        
ùòsÁAB5
cóp—||j|||«St|tjtf«s+    t j |tjd«¬«}g}|D]}    |j|«}t|t«r|j|«nát|t«rK|j |jnd}|jt|j |j"|««n†t j$|«rX|j&dk(r$t)j*dt,t/«¬«|j1«d}|j|«ndt3|«›}t5|«‚Œ|j9|«S#t$rYŒ=wxYw#t6$r
|dk7r‚YŒOwxYw)    a½
        Make a new :class:`pandas.MultiIndex` with the passed list of codes deleted.
 
        Parameters
        ----------
        codes : array-like
            Must be a list of tuples when ``level`` is not specified.
        level : int or level name, default None
        errors : str, default 'raise'
 
        Returns
        -------
        MultiIndex
 
        Examples
        --------
        >>> idx = pd.MultiIndex.from_product([(0, 1, 2), ('green', 'purple')],
        ...                                  names=["number", "color"])
        >>> idx
        MultiIndex([(0,  'green'),
                    (0, 'purple'),
                    (1,  'green'),
                    (1, 'purple'),
                    (2,  'green'),
                    (2, 'purple')],
                   names=['number', 'color'])
        >>> idx.drop([(1, 'green'), (2, 'purple')])
        MultiIndex([(0,  'green'),
                    (0, 'purple'),
                    (1, 'purple'),
                    (2,  'green')],
                   names=['number', 'color'])
 
        We can also drop from a specific level.
 
        >>> idx.drop('green', level='color')
        MultiIndex([(0, 'purple'),
                    (1, 'purple'),
                    (2, 'purple')],
                   names=['number', 'color'])
 
        >>> idx.drop([1, 2], level=0)
        MultiIndex([(0,  'green'),
                    (0, 'purple')],
                   names=['number', 'color'])
        rnr¿rUrzYdropping on a non-lexsorted multi-index without a level parameter may impact performance.r6zunsupported indexer of type Úignore)Ú_drop_from_levelrºrZrÅrBrÃÚindex_labels_to_arrayr“r†r?rŒr§rõrör‰r r„Ústoprôr¥r8r9r$r)Únonzeror(ÚAssertionErrorr¥Údelete)    r^r_r›ÚerrorsÚindsr«ÚlocröÚmsgs             r`ÚdropzMultiIndex.dropF    s…€ðh Ð Ø×(Ñ(¨°°vÓ>Ð >ä˜%¤"§*¡*¬eÐ!4Ô5ð Ü×1Ñ1°%¼r¿x¹xÈÓ?QÔRðˆØ ó    ˆKð Ø—l‘l ;Ó/ô˜c¤3Ô'Ø—K‘K Õ$Ü ¤UÔ+Ø'*§x¡xÐ';˜3Ÿ8š8ÀDØ—K‘K¤ c§i¡i°·±¸4Ó @ÕAÜ×(Ñ(¨Ô-Ø×*Ñ*¨aÒ/Ü Ÿ ™ ðPä.Ü'7Ó'9õ    ð Ÿ+™+›-¨Ñ*CØ—K‘K Õ$à8¼¸c»¸ ÐDCÜ(¨Ó-Ð-ùð-    ð6{‰{˜4ӠРøô?ò Úð ûô6ò ؘXÒ%Øò&ð ús$·*FÁ*DF"Æ    FÆFÆ"F5Æ4F5cóø—tj|«}|j|«}|j|}|j    |«}t |«}d|t j|d«|dk(z<|jd|jdk(rd|t j|d«<||dk(}t|«dk7r|dk7rtd|›d«‚tj|j||«}    ||    S)    NéþÿÿÿFr˜rTr#zlabels z not found in level)rÃr%rr’Ú get_indexerr;rZÚequalr¾r…r¥rÚisinr_)
r^r_r›r*rªrråÚ    nan_codesÚ    not_foundrus
          r`r$zMultiIndex._drop_from_level¡    sò€ô×)Ñ)¨%Ó0ˆØ × "Ñ " 5Ó )ˆØ— ‘ ˜A‘ˆØ×"Ñ" 5Ó)ˆô˜“Kˆ    Ø@Bˆ”—‘˜ EÓ*¨v¸©|Ñ<Ñ=Ø ;‰;q‰>˜TŸZ™Z¨™]Ò *Ø02ˆF”2—8‘8˜I tÓ,Ñ -à˜& B™,Ñ'ˆ    Ü ˆy‹>˜QÒ  6¨XÒ#5ܘW Y KÐ/BÐCÓDÐ DÜ—
‘
˜4Ÿ:™: a™=¨&Ó1Ð1ˆàD‰zÐrbcóH—t|j«}t|j«}t|j«}|j    |«}|j    |«}||||c||<||<||||c||<||<||||c||<||<t |||d¬«S)aú
        Swap level i with level j.
 
        Calling this method does not change the ordering of the values.
 
        Parameters
        ----------
        i : int, str, default -2
            First level of index to be swapped. Can pass level name as string.
            Type of parameters can be mixed.
        j : int, str, default -1
            Second level of index to be swapped. Can pass level name as string.
            Type of parameters can be mixed.
 
        Returns
        -------
        MultiIndex
            A new MultiIndex.
 
        See Also
        --------
        Series.swaplevel : Swap levels i and j in a MultiIndex.
        DataFrame.swaplevel : Swap levels i and j in a MultiIndex on a
            particular axis.
 
        Examples
        --------
        >>> mi = pd.MultiIndex(levels=[['a', 'b'], ['bb', 'aa']],
        ...                    codes=[[0, 0, 1, 1], [0, 1, 0, 1]])
        >>> mi
        MultiIndex([('a', 'bb'),
                    ('a', 'aa'),
                    ('b', 'bb'),
                    ('b', 'aa')],
                   )
        >>> mi.swaplevel(0, 1)
        MultiIndex([('bb', 'a'),
                    ('aa', 'a'),
                    ('bb', 'b'),
                    ('aa', 'b')],
                   )
        Frý)r¤r’r_rtrrO)r^rªÚjrr–Ú    new_namess      r`Ú    swaplevelzMultiIndex.swaplevel¶    sº€ôV˜$Ÿ+™+Ó&ˆ
ܘŸ™Ó$ˆ    Ü˜Ÿ™Ó$ˆ    à × "Ñ " 1Ó %ˆØ × "Ñ " 1Ó %ˆà'1°!¡}°jÀ±mÐ$ˆ
1‰ z !‘}Ø%.¨q¡\°9¸Q±<Ð"ˆ    !‰ i ‘lØ%.¨q¡\°9¸Q±<Ð"ˆ    !‰ i ‘l䨠Y°iÐRWô
ð    
rbcón—|Dcgc]}|j|«‘Œ}}|j|«}|Scc}w)aI
        Rearrange levels using input order. May not drop or duplicate levels.
 
        Parameters
        ----------
        order : list of int or list of str
            List representing new level order. Reference level by number
            (position) or by key (label).
 
        Returns
        -------
        MultiIndex
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([[1, 2], [3, 4]], names=['x', 'y'])
        >>> mi
        MultiIndex([(1, 3),
                    (2, 4)],
                   names=['x', 'y'])
 
        >>> mi.reorder_levels(order=[1, 0])
        MultiIndex([(3, 1),
                    (4, 2)],
                   names=['y', 'x'])
 
        >>> mi.reorder_levels(order=['y', 'x'])
        MultiIndex([(3, 1),
                    (4, 2)],
                   names=['y', 'x'])
        )rÚ_reorder_ilevels)r^Úorderrªr•s    r`Úreorder_levelszMultiIndex.reorder_levelsð    s=€ð@5:Ö:¨q×'Ñ'¨Õ*Ð:ˆÐ:Ø×&Ñ& uÓ-ˆØˆ ùò;s…2có^—t|«|jk7r$td|j›dt|«›«‚|Dcgc]}|j|‘Œ}}|Dcgc]}|j|‘Œ}}|Dcgc]}|j
|‘Œ}}t |||d¬«Scc}wcc}wcc}w)Nz2Length of order must be same as number of levels (z), got Frý)r…r¦r(r’r_rtrO)r^r<rªrr–r8s      r`r;zMultiIndex._reorder_ilevels
s³€Ü ˆu‹:˜Ÿ™Ò %Ü ØDÀTÇ\Á\ÀNðSܘ5“zlð$óð ð/4Ö4¨d—k‘k !“nÐ4ˆ
Ð4Ø,1Ö2 qT—Z‘Z “]Ð2ˆ    Ð2Ø,1Ö2 qT—Z‘Z “]Ð2ˆ    Ð2䨠Y°iÐRWô
ð    
ùò    5ùÚ2ùÚ2sÁB ÁB%Á9B*c#óK—t|«|jkDr%tdt|«›d|j›d«‚tt|««D]0}t    |j
||j ||||¬«–—Œ2y­w)NzLength of new_levels (z) must be <= self.nlevels (ú)rþ)r…r¦r(r r@r_r’)r^rrƒrªs    r`Ú_recode_for_new_levelsz!MultiIndex._recode_for_new_levels"
sŠèø€ô ˆz‹?˜TŸ\™\Ò )Ü Ø(¬¨Z«Ð(9ð:,Ø,0¯L©L¨>¸ð<óð ô”s˜:“Ó'ò    ˆAÜ'Ø—
‘
˜1‘ ˜tŸ{™{¨1™~¨z¸!©}À4ôó ñ    ùs‚BBc    ó€—d„}|jDcgc]!}tj|||«dd¬«‘Œ#c}Scc}w)a
 
        we are categorizing our codes by using the
        available categories (all, not just observed)
        excluding any missing ones (-1); this is in preparation
        for sorting, where we need to disambiguate that -1 is not
        a valid valid
        có¦—tjt|«r&tj|«j    «dznd|j
¬«S)NrUrr¿)rZrær…r´r¡r“)r«s r`Úcatsz/MultiIndex._get_codes_for_sorting.<locals>.cats8
s?€Ü—9‘9Ü36°{Ô3C”—‘˜Ó%×)Ñ)Ó+¨aÒ/ÈØ!×'Ñ'ôð rbTFrä)r_r=Ú
from_codes)r^rDr«s   r`rz!MultiIndex._get_codes_for_sorting/
sD€ò    ð $Ÿz™zö
àô × "Ñ " ;±°[Ó0AÀ4ÐRWÖ Xò
ð    
ùò
s’&;có —t|«s|g}|Dcgc]}|j|«‘Œ}}d}|Dcgc]}|j|‘Œ}}t|t«r"t |«t |«k(s`t d«‚|rN|jtt |j««Dcgc]}||vsŒ|j|‘Œc}«n|d}t|||d¬«}t|«}|jD    cgc]}    |    j|«‘Œ}
}    t|
|j|j|d¬«} | |fScc}wcc}wcc}wcc}    w)a›
        Sort MultiIndex at the requested level.
 
        The result will respect the original ordering of the associated
        factor at that level.
 
        Parameters
        ----------
        level : list-like, int or str, default 0
            If a string is given, must be a name of the level.
            If list-like must be names or ints of levels.
        ascending : bool, default True
            False to sort in descending order.
            Can also be a list to specify a directed ordering.
        sort_remaining : sort by the remaining levels after level
        na_position : {'first' or 'last'}, default 'first'
            Argument 'first' puts NaNs at the beginning, 'last' puts NaNs at
            the end.
 
            .. versionadded:: 2.1.0
 
        Returns
        -------
        sorted_index : pd.MultiIndex
            Resulting index.
        indexer : np.ndarray[np.intp]
            Indices of output values in original index.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([[0, 0], [2, 1]])
        >>> mi
        MultiIndex([(0, 2),
                    (0, 1)],
                   )
 
        >>> mi.sortlevel()
        (MultiIndex([(0, 1),
                    (0, 2)],
                   ), array([1, 0]))
 
        >>> mi.sortlevel(sort_remaining=False)
        (MultiIndex([(0, 2),
                    (0, 1)],
                   ), array([0, 1]))
 
        >>> mi.sortlevel(1)
        (MultiIndex([(0, 1),
                    (0, 2)],
                   ), array([1, 0]))
 
        >>> mi.sortlevel(1, ascending=False)
        (MultiIndex([(0, 2),
                    (0, 1)],
                   ), array([0, 1]))
        Nz(level must have same length as ascendingrT)ÚordersrrF)r_r’rtrr”)r0rr_rºr¤r…r†r‰r r’rIr,rsrOrt) r^r›Ú    ascendingÚsort_remainingrrrr_rÈr«r–r4s             r`Ú    sortlevelzMultiIndex.sortlevelC
sO€ô~˜EÔ"ؐGˆEð49ö
Ø,/ˆD× "Ñ " 3Õ 'ð
ˆð
ðˆ    à,1Ö2 S—‘˜C“Ð2ˆÐ2ä i¤Ô &ܐu“:¤ Y£Ò/Ü Ð!KÓLÐLÙ Ø L‰LÜ,1´#°d·k±kÓ2BÓ,CÖX SÀsÐRWÒGW—‘˜C“ÒXõ ð˜a™ˆIä!Ø ˜)°È$ô
ˆô& gÓ.ˆØBFÇ*Á*ÖM°;[×%Ñ% gÕ.ÐMˆ    ÐM䨨—;‘;Ø—*‘*ØØ"ô 
ˆ    ð˜'Ð!Ð!ùòA
ùò
3ùòYùòNs“D<³EÂ*    EÂ4EÃ:E cóì—t|t«s@|€|}n;|dk\j«r|j|«}n    tj    |«}|j ||«}|S#t
$r|cYSwxYwrð)rºrOrÁrsrÎruÚ_maybe_preserve_names)r^rrÈÚpreserve_namess    r`Ú_wrap_reindex_resultzMultiIndex._wrap_reindex_result¨
sx€Ü˜&¤*Ô-؈ؘؑQ‘,×#Ñ#Ô%ØŸ™ 7Ó+‘ð"Ü'×3Ñ3°FÓ;Fð
×+Ñ+¨F°NÓCˆØˆ øô !ò"à!’Mð"ús¼A%Á% A3Á2A3có´—|rU|j|jk(r<|j|jk7r#|jd¬«}|j|_|S)NFrZ)r¦rtrƒ)r^rrMs   r`rLz MultiIndex._maybe_preserve_names¸
sE€á Ø—‘ $§,¡,Ò.Ø— ‘  §
¡
Ò*à—[‘[ e[Ó,ˆFØŸ:™:ˆFŒL؈ rbcóF—t|«r t|«r t|«‚yr¹)r-r/r#rAs  r`Ú_check_indexing_errorz MultiIndex._check_indexing_errorÅ
s#€Ü˜3Ô¤;¨sÔ#3ô$ CÓ(Ð (ð    $4rbcó4—|jdjS)zA
        Should integer key(s) be treated as positional?
        r)r’Ú_should_fallback_to_positionalrés r`rSz)MultiIndex._should_fallback_to_positionalÌ
s€ð {‰{˜1‰~×<Ñ<Ð<rbcó•—|}t|t«stj|«}t    |«r>t|dt
«s+|j |«}|j|||«|||fSt‰|%||«Srð)
rºrBrÃrÄr…r»Ú_get_indexer_level_0Ú_raise_if_missingÚsuperÚ_get_indexer_strict)r^rBÚ    axis_nameÚkeyarrrÈÚ    __class__s     €r`rXzMultiIndex._get_indexer_strictÔ
s{ø€ðˆÜ˜&¤%Ô(Ü×*Ñ*¨6Ó2ˆFä ˆvŒ;œz¨&°©)´UÔ;Ø×/Ñ/°Ó7ˆGà × "Ñ " 3¨°Ô ;ؘ‘= 'Ð)Ð )ä‰wÑ*¨3°    Ó:Ð:rbc󀕗|}t|t«stj|«}t    |«r{t|dt
«sh|dk(}|j «rR|jdj|«}|dk(}|j «rt||›d«‚t|›d«‚yt‰|-|||«S)Nrr˜z  not in index) rºrBrÃrÄr…r»r™r’r1r¥rWrV)    r^rBrÈrYrZruÚcheckÚcmaskr[s            €r`rVzMultiIndex._raise_if_missingã
s¹ø€ØˆÜ˜#œuÔ%Ü×*Ñ*¨3Ó/ˆFä ˆvŒ;œz¨&°©)´UÔ;ð˜b‘=ˆD؏x‰xŒzØŸ ™  A™×2Ñ2°6Ó:Ø ™ Ø—9‘9”;Ü" f¨U¡m _°MÐ#BÓCÐCô & ¨Ð7Ó8Ð8ðô‘7Ñ,¨S°'¸9ÓEÐ Erbcó¦—|jd}|jd}tj||d¬«}t    |«}|j |«S)z]
        Optimized equivalent to `self.get_level_values(0).get_indexer_for(target)`.
        rF)r_Ú
categoriesr„)r’rŽr=rErBÚget_indexer_for)r^rrr_ÚcatÚcis      r`rUzMultiIndex._get_indexer_level_0÷
sL€ðk‰k˜!‰nˆØ— ‘ ˜A‘ˆÜ×$Ñ$¨5¸SÈ5ÔQˆÜ 3‹ZˆØ×!Ñ! &Ó)Ð)rbcóN—t|t«s|f}|j||¬«S)a¼
        For an ordered MultiIndex, compute slice bound
        that corresponds to given label.
 
        Returns leftmost (one-past-the-rightmost if `side=='right') position
        of given label.
 
        Parameters
        ----------
        label : object or tuple of objects
        side : {'left', 'right'}
 
        Returns
        -------
        int
            Index of label.
 
        Notes
        -----
        This method only works if level 0 index of the MultiIndex is lexsorted.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([list('abbc'), list('gefd')])
 
        Get the locations from the leftmost 'b' in the first level
        until the end of the multiindex:
 
        >>> mi.get_slice_bound('b', side="left")
        1
 
        Like above, but if you get the locations from the rightmost
        'b' in the first level and 'f' in the second level:
 
        >>> mi.get_slice_bound(('b','f'), side="right")
        3
 
        See Also
        --------
        MultiIndex.get_loc : Get location for a label or a tuple of labels.
        MultiIndex.get_locs : Get location for a label/slice/list/mask or a
                              sequence of such.
        ©Úside)rºr»Ú_partial_tup_index)r^Úlabelrfs   r`Úget_slice_boundzMultiIndex.get_slice_bound s,€ô`˜%¤Ô'ؐHˆEØ×&Ñ& u°4Ð&Ó8Ð8rbcó&•—t‰||||«S)aL
        For an ordered MultiIndex, compute the slice locations for input
        labels.
 
        The input labels can be tuples representing partial levels, e.g. for a
        MultiIndex with 3 levels, you can pass a single value (corresponding to
        the first level), or a 1-, 2-, or 3-tuple.
 
        Parameters
        ----------
        start : label or tuple, default None
            If None, defaults to the beginning
        end : label or tuple
            If None, defaults to the end
        step : int or None
            Slice step
 
        Returns
        -------
        (start, end) : (int, int)
 
        Notes
        -----
        This method only works if the MultiIndex is properly lexsorted. So,
        if only the first 2 levels of a 3-level MultiIndex are lexsorted,
        you can only pass two levels to ``.slice_locs``.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([list('abbd'), list('deff')],
        ...                                names=['A', 'B'])
 
        Get the slice locations from the beginning of 'b' in the first level
        until the end of the multiindex:
 
        >>> mi.slice_locs(start='b')
        (1, 4)
 
        Like above, but stop at the end of 'b' in the first level and 'f' in
        the second level:
 
        >>> mi.slice_locs(start='b', end=('b', 'f'))
        (1, 3)
 
        See Also
        --------
        MultiIndex.get_loc : Get location for a label or a tuple of labels.
        MultiIndex.get_locs : Get location for a label/slice/list/mask or a
                              sequence of such.
        )rWÚ
slice_locs)r^r„Úendrör[s    €r`rkzMultiIndex.slice_locs6 sø€ôj‰wÑ! %¨¨dÓ3Ð3rbcóò—t|«|jkDr%tdt|«›d|j›d«‚t|«}dt|«}}t||j|j
«}t |«D]R\}\}}    }
|
||} ||    vrit|«s^    tj|    ||¬«} t| «std|›«‚|dk(r
| dk\r| dz} |tj| | |¬«zcS|j|    |«}t|t«r!||dz
kr|j}|j }ŒÀ||dz
kr7|tj| |d¬«z}|tj| |d    ¬«z}Œÿt|t«r)|j}|tj| ||¬«zcS|tj| ||¬«zcSy#t$r} td|›«| ‚d} ~ wwxYw)
Nú Key length (z-) was greater than MultiIndex lexsort depth (r@rrezLevel type mismatch: ÚrightrUÚleft)r…r¥r%rËr’r_Ú    enumerater;rÚ searchsortedrur.Ú_get_loc_single_level_indexrºrõr„r&)r^rirfÚnr„rlÚzippedrrrr«Úsectionr,r§r s               r`rgzMultiIndex._partial_tup_indexm s €Ü ˆs‹8d×)Ñ)Ò )Ü$Øœs 3›x˜jð)Ø×'Ñ'Ð(¨ð+óð ô
‹HˆØœ˜D›    ˆsˆÜS˜$Ÿ+™+ t§z¡zÓ2ˆÜ*3°FÓ*;ó'    KÑ &ˆAÑ&S˜+Ø! %¨Ð,ˆGð˜#‰~¤d¨3¤iðLÜ×,Ñ,¨S°#¸DÔACô" #”ä#Ð&;¸C¸5Ð$AÓBÐBؘ7’? s¨a¢xؘ1‘HCØœu×1Ñ1°'¸3ÀTÔJÑJÒJà×2Ñ2°3¸Ó<ˆCܘ#œuÔ%¨!¨a°!©eª)🠠  ™    Ø—h‘h‘ؐQ˜‘U’ðœe×0Ñ0ؘS wôñð
¤× 2Ñ 2ؘS vô!ñ‘ô˜C¤Ô'Ø—i‘iØœu×1Ñ1°'¸3ÀTÔJÑJÒJàœu×1Ñ1°'¸3ÀTÔJÑJÒJñO'    Køô!òLä#Ð&;¸C¸5Ð$AÓBÈÐKûðLúsÂ"GÇ    G6Ç"G1Ç1G6cóR—t|«r t|«ry|j|«S)a‹
        If key is NA value, location of index unify as -1.
 
        Parameters
        ----------
        level_index: Index
        key : label
 
        Returns
        -------
        loc : int
            If key is NA value, loc is -1
            Else, location of key in index.
 
        See Also
        --------
        Index.get_loc : The get_loc method for (single-level) index.
        r˜)r2r;r?)r^Ú level_indexrBs   r`rsz&MultiIndex._get_loc_single_level_index  s%€ô& SŒ>œd 3œiàà×&Ñ& sÓ+Ð +rbc    óÔ‡—‰j|«ˆfd„}t|t«s‰j|d¬«}||«St    |«}‰j
|krt d|›d‰j
›d«‚|‰j
k(r(‰jr    ‰jj|«S‰j}|d|||d}    }|sd}
t    ‰«} n    ‰j||«\}
} |
| k(r t |«‚|    s t!|
| «St#j$dt&t)«¬    «t+j,|
| t*j.¬
«}t1|    t    |««D]b\}} ‰j2||‰j5‰j6|| «k(} | j9«s|| }t    |«rŒYt |«‚t    |«| |
z
k7r||«St!|
| «S#t $r}t |«|‚d}~wt$r6‰j|tt‰j
«««\}}|cYSwxYw#t$r}t |«|‚d}~wwxYw) aÌ
        Get location for a label or a tuple of labels.
 
        The location is returned as an integer/slice or boolean
        mask.
 
        Parameters
        ----------
        key : label or tuple of labels (one for each level)
 
        Returns
        -------
        int, slice object or boolean mask
            If the key is past the lexsort depth, the return may be a
            boolean mask array, otherwise it is always a slice or int.
 
        See Also
        --------
        Index.get_loc : The get_loc method for (single-level) index.
        MultiIndex.slice_locs : Get slice location given start label(s) and
                                end label(s).
        MultiIndex.get_locs : Get location for a label/slice/list/mask or a
                              sequence of such.
 
        Notes
        -----
        The key cannot be a slice, list of same-level labels, a boolean mask,
        or a sequence of such. If you want to use those, use
        :meth:`MultiIndex.get_locs` instead.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([list('abb'), list('def')])
 
        >>> mi.get_loc('b')
        slice(1, 3, None)
 
        >>> mi.get_loc(('b', 'e'))
        1
        cóH•—t|tj«r|jtjk7r|St j |t‰««}t|t«r|Stjt‰«d¬«}|jd«d||<|S)z<convert integer indexer to boolean mask or slice if possiblerOr¿FT) rºrZrÅr“r rÚmaybe_indices_to_slicer…rõÚemptyÚfill)r,rur^s  €r`Ú_maybe_to_slicez+MultiIndex.get_loc.<locals>._maybe_to_sliceä sxø€ä˜c¤2§:¡:Ô.°#·)±)¼r¿w¹wÒ2Fؐ
ä×,Ñ,¨S´#°d³)Ó<ˆCܘ#œuÔ%ؐ
ä—8‘8œC ›I¨VÔ4ˆDØ I‰IeÔ ØˆD‰I؈Krbr©r›rnz) exceeds index depth (r@Nz3indexing past lexsort depth may impact performance.r6r¿)rQrºr»Ú_get_level_indexerr…r¦r¥r£r&r?ruÚ get_loc_levelr¤r r¥rkrõr8r9r$r)rZrær rqr_rsr’rÁ)r^rBr~r,Úkeylenr§Ú_rªÚlead_keyÚ
follow_keyr„r&rrus`             r`r?zMultiIndex.get_loc¹ sWø€ðR     ×"Ñ" 3Ô'ô     ô˜#œuÔ%Ø×)Ñ)¨#°QÐ)Ó7ˆCÙ" 3Ó'Ð 'äS“ˆØ <‰<˜&Ò  Üؘv˜hÐ&=¸d¿l¹l¸^È1ÐMóð ð T—\‘\Ò ! d§n¢nð Ø—|‘|×+Ñ+¨CÓ0Ð0ð × Ñ ˆØ" 2 A˜w¨¨A¨B¨*ˆá؈Eܐt“9‰Dð -Ø"Ÿo™o¨h¸ÓA‘ tð DŠ=ܘ3“-Ð áܘ Ó%Ð %ä ‰ Ø AÜ Ü'Ó)õ    
ô i‰i˜˜t¬2¯7©7Ô3ˆä˜j¬#¨h«-Ó8ò    $‰DˆAˆqØ—:‘:˜a‘= Ñ%¨×)IÑ)IØ— ‘ ˜A‘ ó*ñˆDð—8‘8”:ؘ$‘iÜs•8ܘs“mÐ#ð    $ô(+¨3£x°4¸%±<Ò'?‰˜sÓ#ÐWÄUÈ5ÐRVÓEWÐWøôaò -ܘs“m¨Ð,ûÜò à×+Ñ+¨C´´e¸D¿L¹LÓ6IÓ1JÓK‘QØ’
ð ûô$ò -ô˜s“m¨Ð,ûð -ús6ÂG3ÃI Ç3    I
Ç< HÈ?I
É    I
É     I'É I"É"I'có—t|ttf«s|j|«}n|Dcgc]}|j|«‘Œ}}|j    ||¬«\}}|s&t j |«r |||dz}||fS||}||fScc}w)a
        Get location and sliced index for requested label(s)/level(s).
 
        Parameters
        ----------
        key : label or sequence of labels
        level : int/level name or list thereof, optional
        drop_level : bool, default True
            If ``False``, the resulting index will not drop any level.
 
        Returns
        -------
        tuple
            A 2-tuple where the elements :
 
            Element 0: int, slice object or boolean array.
 
            Element 1: The resulting sliced multiindex/index. If the key
            contains all levels, this will be ``None``.
 
        See Also
        --------
        MultiIndex.get_loc  : Get location for a label or a tuple of labels.
        MultiIndex.get_locs : Get location for a label/slice/list/mask or a
                              sequence of such.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([list('abb'), list('def')],
        ...                                names=['A', 'B'])
 
        >>> mi.get_loc_level('b')
        (slice(1, 3, None), Index(['e', 'f'], dtype='object', name='B'))
 
        >>> mi.get_loc_level('e', level='B')
        (array([False,  True, False]), Index(['b'], dtype='object', name='A'))
 
        >>> mi.get_loc_level(['b', 'e'])
        (1, None)
        rrU)rºr¤r»rÚ_get_loc_levelrr.)r^rBr›Ú
drop_levelrr,rws       r`rzMultiIndex.get_loc_level3 sž€ôR˜%¤$¬ Ô/Ø×*Ñ*¨5Ó1‰Eà<AÖB°ST×+Ñ+¨CÕ0ÐBˆEÐBà×%Ñ% c°Ð%Ó7‰ˆˆRÙ܏~‰~˜cÔ"à˜#  a¡Ð(ðBˆwˆð˜#‘YØBˆwˆùòCs­B    có    ‡—ˆfd„}t|ttf«r t|«t|«k7r t    d«‚d}t ||«D]_\}}‰j ||¬«\}}t|t«r+tjt‰«t¬«}    d|    |<|    }|€|n||z}Œa    |||«}
||
fSt|t«r t|«}t|t«r¤|dk(rž    |‰jdvr!‰j||¬«} || dg«}| |fS    t!d„|D««s2t|«‰j"k(r*‰j$r    ‰j&j)|«dfS‰j)|«} t-t|««D cgc]} || tdd«k7sŒ| ‘Œ}} t|«‰j"k(rˆt/| «r| dfSt-t|««D cgc]B} t|| t0«r‰j| j2s|| tdd«k7r| ‘ŒD}} t|«‰j"k(rg}| || |«fSd} t5|«D]È\} }t|t«s…‰j|| ¬«}t|t«r_t7j8|«st7j:|t‰««rŒntjt‰«t¬«}d||<n'|}n$t7j8|«rŒ±td    |›«‚| €|} ŒÄ| |z} ŒÊ| € tdd«} t-t|««D cgc]} || tdd«k7sŒ| ‘Œ}} | || |«fS‰j||¬«} t|t0«rI‰j|j2r0‰j|j)|«}t/|«s| ‰| fS    || |g«}| |fS#t$r ‰|}
Y||
fSwxYw#ttf$rYŒwxYw#t*$r} t+|«| ‚d} ~ wt$rYŒáwxYwcc} wcc} wcc} w#t$r ‰| }Y| |fSwxYw)
zX
        get_loc_level but with `level` known to be positional, not name-based.
        cóZ•—‰|}t|d¬«D]}|j|g«}Œ|S)z‚
            If level does not exist or all levels were dropped, the exception
            has to be handled outside.
            T)Úreverse)ÚsortedÚ_drop_level_numbers)rÈr’r4rªr^s    €r`Úmaybe_mi_droplevelsz6MultiIndex._get_loc_level.<locals>.maybe_mi_droplevelsp s>ø€ð
˜W™ ˆIä˜F¨DÔ1ò ?Ø%×9Ñ9¸1¸#Ó>‘    ð ?ðÐ rbz:Key for location must have same length as number of levelsNrr¿Trc3ó<K—|]}t|t«–—Œy­wr¹)rºrõrs  r`r¾z,MultiIndex._get_loc_level.<locals>.<genexpr>£ sèø€Ò9°”z !¤U×+Ñ9ùs‚z'Expected label or tuple of labels, got )rºr»r¤r…r(rËr‡rõrZrÂrOr†r’r€rur#r™r¦r£r&r?r¥r r.rpÚ!_supports_partial_string_indexingrqrÃÚ is_null_sliceÚ is_full_slice)r^rBr›rŽr•rrr,r4rurwrÈr§rªÚilevelsÚ    loc_levelÚk_indexr]Ú result_indexs`                  r`r‡zMultiIndex._get_loc_levelj s«ø€ô
    ô eœe¤T˜]Ô +ܐ3‹xœ3˜u›:Ò%Ü$ØPóððˆFܘe S›/ò A‘QØ!%×!4Ñ!4°Q¸cÐ!4Ó!B‘Yܘc¤5Ô)ÜŸ8™8¤C¨£I´TÔ:DØ $D˜‘IؐCØ & ™°F¸S±L‘ð  Að "ñ)¨°Ó7ð ˜2:Ð ô cœ4Ô  Ü˜“*ˆCä cœ5Õ ! e¨q£jð à˜$Ÿ+™+ a™.Ñ(Ø"×5Ñ5°cÀÐ5ÓGGÙ 3°G¸a¸SÓ AIØ" IÐ-Ð-ð)ôÑ9°SÔ9Õ9ܐs“8˜tŸ|™|Ò+°·²ðØ $§ ¡ × 4Ñ 4°SÓ 9¸4Ð@Ð@ðŸ,™, sÓ+Ü&+¬C°«H£oÖU ¸¸Q¹Ä5ÈÈtÓCTÓ9Tš1ÐUÐUܐw“< 4§<¡<Ò/Ü! 'Ô*à&¨˜}Ð,ô"'¤s¨3£x£öàä *¨3¨q©6´3Ô 7Ø#'§;¡;¨q¡>×#SÒ#Sà ™F¤e¨D°$Ó&7Ò7ò ðGðô˜7“| t§|¡|Ò3à"$˜ØÑ 3°G¸WÓ EÐEÐEðÜ% c›Nò+‘DAqÜ% a¬Ô/Ø$(×$;Ñ$;¸AÀQÐ$;Ó$G˜    Ü% i´Ô7Ü"×0Ñ0°Ô;¼s×?PÑ?PØ )¬3¨t«9ô@ð!)ô')§h¡h¬s°4«yÄÔ&E˜GØ15˜G IÒ.ð'0™Gä×*Ñ*¨1Ô-à ô
(Ð*QÐRUÐQVÐ(WÓXÐXàØ")™à 7Ñ*™ð;+ð<?Ü# D¨$Ó/GÜ&+¬C°«H£oÖU ¸¸Q¹Ä5ÈÈtÓCTÓ9Tš1ÐUÐUØÑ 3°G¸WÓ EÐEÐEà×-Ñ-¨c¸Ð-Ó?ˆGä˜3¤Ô$Ø—K‘K Ñ&×HÒH🠙  EÑ*×2Ñ2°3Ó7Ü! %Ô(à" D¨¡MÐ1Ð1ð -Ù2°7¸U¸GÓD ð˜LÐ(Ð (øô_ò "ð˜&‘\‘à˜2:Ð ð  "ûô$Ô0Ð1ò Úð ûô$ò5Ü& s›m°Ð4ûÜ$òòðüòVùòùò`Vøô ò -Ø# G™}‘ à˜LÐ(Ð (ð -ússÂ0    PÃ01PÅP5ÆQÆ7QÇ:AQ"Í$Q'Í<Q'Ï:
Q,ÐPÐPÐP2Ð1P2Ð5    QÐ> Q
QÑQÑ,RÑ?Rcó—|j|}|j|}||fd„}t|t«rW|j}|duxr|dk}    |j
|j |j
«}    n|rt|«dz
}    nd}    |j|j |j«}
n/|rd}
n*t|    t«r t|«}
nt|«dz
}
t|    t«st|
t«r$t|    d|    «}    t|
d|
«}
||    |
|«S|dkDs|jdk(s||r|
dz
n|
dz}
||    |
|«Stj||    d¬«} tj||
d¬«} t| | |«S|j||«} |dkDs|jdk(rlt| t«r!|| j
k\|| jkz}|St!j"|| k(t$¬    «}|j'«s t|«‚|St| t«rEtj|| j
d¬«}    tj|| jd¬«}n0tj|| d¬«}    tj|| d¬«}|    |k(r t|«‚t|    |«S#t$rC|j|j
|j|j«x}    }
|    j}YŒ+wxYw)
Ncóޗ|||}||dk(r ||k\||kz}n9tj||||j¬«}tj||«}|€|S|j «}|||<|S)NrUr¿)rZrær“rr3rƒ)r„r&rörÈr_Ú new_indexerÚrs       r`Úconvert_indexerz6MultiIndex._get_level_indexer.<locals>.convert_indexer
s€ðÐ"ð˜g™àˆ|˜t qšyØ$¨™~°%¸$±,Ñ?‘ ä—I‘I˜e T¨4°u·{±{ÔCÜ#Ÿj™j¨°Ó2 àˆØ"Ð"à—l‘l“nˆGØ*ˆGGÑ ØˆNrbrrUr„r&rpreror¿)r’r_rºrõrör„r?r…r&r¥Ú slice_indexerr±r¥rrrrsrZrÆrOr™)r^rBr›rÈrxr«r›röÚis_negative_stepr„r&rªr7r Úlocsrls                r`r€zMultiIndex._get_level_indexerÿ sЀð—k‘k %Ñ(ˆ Ø—j‘j Ñ'ˆ à7>Àkó    ô, cœ5Õ !ð—8‘8ˆDØ#¨4Ð/Ò<°D¸1±HÐ ð "Ø—9‘9Ð(Ø'×/Ñ/°·    ±    Ó:‘EÙ%Ü  Ó,¨qÑ0‘EàEà—8‘8Ð'Ø&×.Ñ.¨s¯x©xÓ8‘DÙ%Ø‘DÜ ¤uÔ-ܘ{Ó+‘Dä˜{Ó+¨aÑ/Dô˜%¤Ô'¬:°d¼EÔ+Bô
   w°Ó6Ü˜t V¨TÓ2Ù& u¨d°DÓ9Ð9à˜’˜d×1Ñ1°QÒ6¸$Ð:Jñ&6˜˜qš¸DÀ1¹HÙ& u¨d°DÓ9Ð9ô×&Ñ& {°EÀÔGÜ×&Ñ& {°D¸wÔGÜ˜Q  4Ó(Ð(ð×2Ñ2°;ÀÓDˆCàqŠy˜D×/Ñ/°1Ò4ä˜c¤5Ô)à'¨3¯9©9Ñ4¸ÀsÇxÁxÑ9OÑPDؐKä—z‘z +°Ñ"4¼DÔAà—x‘x”zä" 3›-Ð'ؐ ä˜#œuÔ%ä×*Ñ*¨;¸¿    ¹    ÈÔOä×(Ñ(¨°c·h±hÀVÔL‘ä×*Ñ*¨;¸À&ÔIÜ×(Ñ(¨°cÀÔHà˜Š|ä˜s“mÐ#ܘ Ó$Ð $øôqò "ð +×8Ñ8¸¿¹ÀCÇHÁHÈcÏhÉhÓWÐW˜Ø—z‘z“ð     "úsÁBKËAL Ì L cót‡ —ttj|««Dcgc]
\}}|sŒ    |‘Œ }}}|r-|d|jk\rt    d|›d|j›«‚t d„|D««r t d«‚t|«Š dˆ fd„ }d}t|«D]U\}}d}tj|«rAt|«‰ k7r td«‚tj|«}|€¾|j«}n­t|«r>    |j|||¬    «}|€‹tj*gtj,¬ «cStj.|«r;|€8|t|«d z
k(r'tj0‰ tj,¬ «cSŒø|j|||¬    «}||«}|€|}Œ||z}tj
|«rŒ6tj
|«sŒMt#|«‚|€%tj*gtj,¬ «S|j3«d } |j5|| «Scc}}w#tt t"f$rY}    |D]I}
t%|
«s|    ‚|j|
||¬    «} |€    || «}Œ/t'| t(«rd
|| <ŒE|| z}ŒKYd}    ~    Œ”d}    ~    wwxYw)a
        Get location for a sequence of labels.
 
        Parameters
        ----------
        seq : label, slice, list, mask or a sequence of such
           You should use one of the above for each level.
           If a level should not be used, set it to ``slice(None)``.
 
        Returns
        -------
        numpy.ndarray
            NumPy array of integers suitable for passing to iloc.
 
        See Also
        --------
        MultiIndex.get_loc : Get location for a label or a tuple of labels.
        MultiIndex.slice_locs : Get slice location given start label(s) and
                                end label(s).
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([list('abb'), list('def')])
 
        >>> mi.get_locs('b')  # doctest: +SKIP
        array([1, 2], dtype=int64)
 
        >>> mi.get_locs([slice(None), ['e', 'f']])  # doctest: +SKIP
        array([1, 2], dtype=int64)
 
        >>> mi.get_locs([[True, False, True], slice('e', 'f')])  # doctest: +SKIP
        array([2], dtype=int64)
        r˜zIMultiIndex slicing requires the index to be lexsorted: slicing on levels z, lexsort depth c3ó,K—|] }|tu–—Œy­wr¹)ÚEllipsisrs  r`r¾z&MultiIndex.get_locs.<locals>.<genexpr>› sèø€Ò* ˆq”HŒ}Ñ*ùs‚z2MultiIndex does not support indexing with Ellipsisc󀕗t|t«r,tj‰tj¬«}d||<|S|S)Nr¿T)rºrõrZrÂÚbool_)rÈr™rts  €r`Ú_to_bool_indexerz-MultiIndex.get_locs.<locals>._to_bool_indexer¢ s6ø€Ü˜'¤5Ô)Ü Ÿh™h q´·±Ô9 Ø'+ ˜GÑ$Ø"Ð"؈NrbNzLcannot index with a boolean indexer that is not the same length as the index)r›rÈTr¿rUr©rNúnpt.NDArray[np.bool_])rqrÃÚis_true_slicesr¥r%r™rÁr…rôr†rZrÆrƒr0r€r#rur¥r-rºrõr´r r‘rær'Ú_reorder_indexer)r^ÚseqrªÚsÚ true_slicesr¤rÈrÚ lvl_indexerr§rúÚ item_indexerÚ pos_indexerrts             @r`Úget_locszMultiIndex.get_locsp s³ø€ôH(1´×1CÑ1CÀCÓ1HÓ'I×O™V˜a ÊQ’qÐOˆ ÑOÙ ˜; r™?¨d×.AÑ.AÒAÜ$ðØ(˜MÐ)9¸$×:MÑ:MÐ9NðPóð ô
Ñ* cÔ*Ô *Ü%ØDóð ô ‹Iˆõ    ð15ˆä˜c“Nó@    (‰DˆAˆqØ@DˆKä×"Ñ" 1Ô%ܐq“6˜Q’;Ü$ð>óðô!Ÿj™j¨›m ؐ?Ø"-×"2Ñ"2Ó"4‘Kä˜a”ð8Ø"&×"9Ñ"9¸!À1ÈgÐ"9Ó"VKð0Ð&ôŸ8™8 B¬b¯g©gÔ6Ò6ä×"Ñ" 1Ô%à? q¬C°«H°q©LÒ'8ÜŸ9™9 Q¬b¯g©gÔ6Ò6Øð#×5Ñ5°a¸qÈ'Ð5ÓR ñ+¨;Ó7ˆK؈Ø%’à˜;Ñ&Ü—v‘v˜g–¬2¯6©6°+Ö+>Ü" 3›-Ð'ðA@    (ðF ˆ?Ü—8‘8˜B¤b§g¡gÔ.Ð .à—o‘oÓ'¨Ñ*ˆ Ø×$Ñ$ S¨+Ó6Ð6ùóPøôV*¬9´hÐ?ò8ð ò8˜Ü*¨1œ~à"%˜Ið(,×'>Ñ'>Ø Q°ð(?ó(˜ ð'Ð.Ù*:¸<Ó*H™KÜ'¨ ´eÔ<Ø8<˜K¨ Ò5à'¨<Ñ7™Kö8ûð 8ús#£
I®IÄ
I
J7ÉAJ2Ê2J7có€—d}t|«D]ñ\}}tj|«s tj|«s t    |«rn²t |«rbt |«dkrn˜|j«r@|j|j|«}||dk\}|dd|ddkDj«}nHd}nEt|t«r3|j«r |jduxr|jdk}nd}nd}|sŒñn|s|St |«}d}t|«D]\}}t    |«r|g}tj|«rtj|«|}    n»t |«rüt|tj t"t$t&f«s t)|d«}t+j,|«}tj.t |j|«tj0¬«t |j|«z}
|j|j|«} | | dk\} tjt | ««|
| <|
|j2||}    n´t|t«r:|j.|jdkrtj|«ddd…|}    njt|t«rB|j4€6|j6€*tj.|ftj8¬«|}    ntj|«|}    |    f|z}Œtj:|«} || S)    am
        Reorder an indexer of a MultiIndex (self) so that the labels are in the
        same order as given in seq
 
        Parameters
        ----------
        seq : label/slice/list/mask or a sequence of such
        indexer: a position indexer of self
 
        Returns
        -------
        indexer : a sorted position indexer of self ordered as seq
        FrUrNr˜Trjr¿)rqrÃr‘rôr2r0r…rÛr’r1r™rºrõrörZrærÅr>rBr8rArrËÚonesrr_r„r&r r³) r^r©rÈÚ    need_sortrªrÚk_codesrtrÚ    new_orderÚ key_order_mapÚ level_indexerÚinds              r`r¨zMultiIndex._reorder_indexer÷ s€ð(ˆ    Ü˜c“Nò    ‰DˆAˆqÜ× Ñ  Ô#¤s×':Ñ':¸1Ô'=ÄÈ1ÄØÜ˜a”ܐq“6˜Q’;ØØ×'Ñ'Ô)ð#Ÿk™k¨!™n×8Ñ8¸Ó;GØ% g°¡lÑ3Gà!(¨¨" °¸¸° Ñ!;× @Ñ @Ó B‘Ià $‘IܘAœuÔ%Ø×%Ñ%Ô'Ø !§¡¨dР2Ò A°q·v±vÀ±z‘Ià $‘Iࠐ    ÚÙð/    ñ0؈Nä ‹IˆØ')ˆô˜c“Nó    '‰DˆAˆqܘŒ|àCÜ×"Ñ" 1Ô%ÜŸI™I a›L¨Ñ1’    Ü˜a”ä! !¤b§j¡j´.Ä%ÌÐ%SÔTÜ& q¨$Ó/AÜ—L‘L “OÜ "§¡¬¨D¯K©K¸©NÓ(;Ä2Ç9Á9Ô MÔPSØ—K‘K ‘NóQñ! ð!%§ ¡ ¨A¡× :Ñ :¸1Ó = Ø -¨m¸qÑ.@Ñ A Ü/1¯y©y¼¸]Ó9KÓ/L ˜mÑ,à)¨$¯*©*°Q©-¸Ñ*@ÑA‘    Ü˜AœuÔ%¨!¯&©&Ð*<ÀÇÁÈ!ÂäŸI™I a›L©¨2¨Ñ.¨wÑ7‘    Ü˜AœuÔ%¨!¯'©'¨/¸a¿f¹f¸näŸG™G Q D´·±Ô8¸ÑA‘    ôŸI™I a›L¨Ñ1    Ø< $Ñ&ŠDð;    'ô@j‰j˜ÓˆØs‰|Ðrbcób—|r|r||kr td«‚|jdj||«\}}|j||«\}}t|j«}|d|||d<|jDcgc]}|||‘Œ    }    }|    d|z
|    d<t ||    |j d¬«Scc}w)aÓ
        Slice index between two labels / tuples, return new MultiIndex.
 
        Parameters
        ----------
        before : label or tuple, can be partial. Default None
            None defaults to start.
        after : label or tuple, can be partial. Default None
            None defaults to end.
 
        Returns
        -------
        MultiIndex
            The truncated MultiIndex.
 
        Examples
        --------
        >>> mi = pd.MultiIndex.from_arrays([['a', 'b', 'c'], ['x', 'y', 'z']])
        >>> mi
        MultiIndex([('a', 'x'), ('b', 'y'), ('c', 'z')],
                   )
        >>> mi.truncate(before='a', after='b')
        MultiIndex([('a', 'x'), ('b', 'y')],
                   )
        zafter < beforerFrý)r†r’rkr¤r_rOr)
r^ÚbeforeÚafterrªr7rprorr«r–s
          r`ÚtruncatezMultiIndex.truncateOs€ñ4 ‘V ¨¢ÜÐ-Ó.Ð .à{‰{˜1‰~×(Ñ(¨°Ó7‰ˆˆ1Ø—o‘o f¨eÓ4‰ ˆˆeä˜$Ÿ+™+Ó&ˆ
Ø" 1™  a¨Ð*ˆ
1‰ à@DÇ
Á
ÖK°[  eÒ,ÐKˆ    ÐKØ  ‘| aÑ'ˆ    !‰ äØØØ—+‘+Ø"ô    
ð    
ùòLsÁ: B,có²—|j|«ryt|t«syt|«t|«k7ryt|t«s2|j |«syt |j|j«S|j|jk7ryt|j«D]'}|j|}|j|}|dk(}|dk(}tj||«sy||}|j|jj|«}||}|j|jj|«}t|«dk(rt|«dk(rŒ½t|tj«s|j!|«rŒéyt|tj«s|j!|«rŒyt ||«rŒ(yy)zØ
        Determines if two MultiIndex objects have the same labeling information
        (the levels themselves do not necessarily have to be the same)
 
        See Also
        --------
        equal_levels
        TFr˜r)Úis_rºrBr…rOÚ_should_comparer:rÇr¦r r_rZÚ array_equalr’rsrÅÚequals)    r^rrªÚ
self_codesÚ other_codesÚ    self_maskÚ
other_maskÚ self_valuesÚ other_valuess             r`rÀzMultiIndex.equals|s€ð 8‰8EŒ?Øä˜%¤Ô'Øä ˆt‹9œ˜E›
Ò "Øä˜%¤Ô,à×'Ñ'¨Ô.àÜ# D§L¡L°%·-±-Ó@Ð @à <‰<˜5Ÿ=™=Ò (Øät—|‘|Ó$ó    !ˆAØŸ™ A™ˆJØŸ+™+ a™.ˆKØ" bÑ(ˆIØ$¨Ñ*ˆJÜ—>‘> )¨ZÔ8ÙØ# Y JÑ/ˆJØŸ+™+ a™.×0Ñ0×5Ñ5°jÓAˆKà% z kÑ2ˆKØ Ÿ<™<¨™?×2Ñ2×7Ñ7¸ ÓDˆLô ;Ó 1Ò$¬¨\Ó):¸aÒ)?Øä˜k¬2¯:©:Ô6à"×)Ñ)¨,Õ7Ù Ü  ¬b¯j©jÔ9à#×*Ñ*¨;Ö7Ù ä'¨ °\ÖBÙ ð=    !ð@rbcóƗ|j|jk7ryt|j«D]/}|j|j|j|«rŒ/yy)zT
        Return True if the levels of both MultiIndex objects are the same
 
        FT)r¦r r’rÀ)r^rrªs   r`Ú equal_levelszMultiIndex.equal_levelsºsU€ð
<‰<˜5Ÿ=™=Ò (Øät—|‘|Ó$ò    ˆAØ—;‘;˜q‘>×(Ñ(¨¯©°a©Õ9Ùð    ðrbcóê•—|j|«\}}|jr@t‰| ||«}t    |t
«r|St
j t|Žd|¬«S|j|d¬«}t|«r|j|«}n|j|«}|dur    |j«}|S|S#t$r-|dur‚tjdt t#«¬«Y|SwxYw)NrÀF©r»TzTThe values in the array are unorderable. Pass `sort=False` to suppress this warning.r6)Ú_convert_can_do_setopÚhas_duplicatesrWÚ_unionrºrOr¶rËÚ
differencer…r§Ú_get_reconciled_name_objectÚ sort_valuesrur8r9ÚRuntimeWarningr))r^rr»Ú result_namesr•Ú right_missingr[s      €r`rÍzMultiIndex._unionÊsø€Ø"×8Ñ8¸Ó?шˆ|Ø × Ò ô‘W‘^ E¨4Ó0ˆFä˜&¤*Ô-ؐ Ü×)Ñ)ܐV ¨°Lð*óð ð
"×,Ñ,¨T¸Ð,Ó>ˆMܐ=Ô!ØŸ™ ]Ó3‘à×9Ñ9¸%Ó@à˜5Ñ ð
Ø#×/Ñ/Ó1FðˆM6ˆMøô!òؘt‘|ØÜ—M‘MðFä&Ü#3Ó#5ö    ð ˆMðúsÂ(B<Â<2C2Ã1C2có—t|«Sr¹)r1)r^r“s  r`Ú_is_comparable_dtypezMultiIndex._is_comparable_dtypeìs €Ü˜uÓ%Ð%rbcóh—|j|«}|j|k7r|j|«S|S)z¡
        If the result of a set operation will be self,
        return self, unless the names change, in which
        case make a shallow copy of self.
        )Ú_maybe_match_namesrtÚrename)r^rrts   r`rÏz&MultiIndex._get_reconciled_name_objectïs4€ð ×'Ñ'¨Ó.ˆØ :‰:˜Ò à—;‘;˜uÓ%Ð %؈ rbcó2—t|j«t|j«k7rdgt|j«zSg}t|j|j«D]-\}}||k(r|j|«Œ|jd«Œ/|S)zë
        Try to find common names to attach to the result of an operation between
        a and b. Return a consensus list of names if they match at least partly
        or list of None if they have completely different names.
        N)r…rtrËr§)r^rrtÚa_nameÚb_names     r`r×zMultiIndex._maybe_match_namesûs‚€ô ˆtz‰z‹?œc %§+¡+Ó.Ò .ؐ6œC §
¡
›OÑ+Ð +؈Ü! $§*¡*¨e¯k©kÓ:ò    #‰NˆFFØ˜ÒØ— ‘ ˜VÕ$ð— ‘ ˜TÕ"ð     #ð ˆ rbcóL—|j|«\}}|j|«Sr¹)rËÚ    set_names©r^rr•rƒrÒs     r`Ú_wrap_intersection_resultz$MultiIndex._wrap_intersection_result s'€Ø×4Ñ4°UÓ;‰ˆˆ<Ø×Ñ  Ó-Ð-rbcó¦—|j|«\}}t|«dk(r|j«j|«S|j|«Srð)rËr…rìrÝrÞs     r`Ú_wrap_difference_resultz"MultiIndex._wrap_difference_resultsM€Ø×4Ñ4°UÓ;‰ˆˆ<ä ˆv‹;˜!Ò Ø×.Ñ.Ó0×:Ñ:¸<ÓHÐ Hà×#Ñ# LÓ1Ð 1rbcó.—|j}t|t«sGt|«dk(r|dd|jfSd}    tj ||j¬«}||fSt||«}||fS#t tf$r}t|«|‚d}~wwxYw)Nrz.other must be a MultiIndex or a list of tuplesr )    rtrºrBr…rOrÎr†rurE)r^rrÒr-r§s     r`rËz MultiIndex._convert_can_do_setops£€Ø—z‘zˆ ä˜%¤Ô'ܐ5‹z˜QŠØ˜B˜Qx §¡Ð+Ð+àFð2Ü&×2Ñ2°5ÀÇ
Á
Ð2ÓKEðlÐ"Ð"ô/¨t°UÓ;ˆLàlÐ"Ð"øô#¤IÐ.ò2ô$ C›.¨cÐ1ûð2ús¿!A4Á4B BÂBcóª—t|«}t|t«r d}t|«‚t    |«s t d«‚|dur|j «S|S)Nz3> 1 ndim Categorical are not supported at this timezISetting a MultiIndex dtype to anything other than object is not supportedT)r4rºr5rÁr1rurÿ)r^r“rƒr-s    r`rozMultiIndex.astype-s[€ä˜UÓ#ˆÜ eÔ-Ô .ØGˆCÜ% cÓ*Ð *ܘuÔ%Üð#óð ð 4‰<Ø—:‘:“<Р؈ rbcó—t|t«r0|j|jk7r td«‚|jSt|t
«s|fd|jdz
zz}|St |«|jk7r td«‚|S)Nz0Item must have length equal to number of levels.)rrU)rºrOr¦r†rÇr»r…)r^Úitems  r`Ú_validate_fill_valuezMultiIndex._validate_fill_value<s‚€Ü dœJÔ 'à|‰|˜tŸ|™|Ò+Ü Ð!SÓTÐTØ—<‘<РܘD¤%Ô(ð7˜U d§l¡l°QÑ&6Ñ7Ñ7ˆDðˆ ô‹Y˜$Ÿ,™,Ò &ÜÐOÓPÐ P؈ rbcó>—t||«\}}|r|j«St|«t|«k(r||j«}n|j«}g}g}t    t |j |j |j««D]n\}\}}    }
|    j|d¬«} | j|j|««} t|
«} | | |<|j| «|j| «Œpt|||jd¬«S)a
        Return a new MultiIndex of the values set with the mask.
 
        Parameters
        ----------
        mask : array like
        value : MultiIndex
            Must either be the same length as self or length one
 
        Returns
        -------
        MultiIndex
        FrÊrý)r<rƒr…rìrqrËr’r_rrarÎr+r§rOrt)r^rurÂÚnoopÚsubsetrr–rªÚ value_levelr›r«Ú    new_levelÚ value_codesÚnew_codes              r`ÚputmaskzMultiIndex.putmaskJs€ô& d¨DÓ1‰
ˆˆdÙ Ø—9‘9“;Ð ä ˆt‹9œ˜E›
Ò "ؘ4‘[×5Ñ5Ó7‰Fà×/Ñ/Ó1ˆFàˆ
؈    ä4=Ü — ‘ ˜tŸ{™{¨D¯J©JÓ 7ó5
ò    'Ñ 0ˆAÑ0 ˜U K🠙  K°e˜ Ó<ˆIØ#×3Ñ3°F×4KÑ4KÈAÓ4NÓOˆKÜ# KÓ0ˆHØ(ˆHT‰NØ × Ñ ˜iÔ (Ø × Ñ ˜XÕ &ð    'ôØ Y°d·j±jÐSXô
ð    
rbcó˜—|j|«}g}g}t||j|j«D]y\}}}||vrt    |«}|j ||«}n|j |«}|j|«|jtj
t|«||««Œ{t|||jd¬«S)a
        Make new MultiIndex inserting new item at location
 
        Parameters
        ----------
        loc : int
        item : tuple
            Must be same length as number of levels in the MultiIndex
 
        Returns
        -------
        new_index : Index
        Frý) rærËr’r_r…Úinsertr?r§rZr+rOrt)    r^r,rårr–rr›r«Úlev_locs             r`rðzMultiIndex.insertrs€ð×(Ñ(¨Ó.ˆàˆ
؈    Ü%(¨¨t¯{©{¸D¿J¹JÓ%Gò     QÑ !ˆAˆukؘ‰~ô˜e›*ØŸ ™  W¨aÓ0‘àŸ-™-¨Ó*à × Ñ ˜eÔ $Ø × Ñ œRŸY™Y¤|°KÓ'@À#ÀwÓOÕ Pð     QôØ Y°d·j±jÐSXô
ð    
rbcó¬—|jDcgc]}tj||«‘Œ}}t|j||j
d¬«Scc}w)z}
        Make new index with passed location deleted
 
        Returns
        -------
        new_index : MultiIndex
        Frý)r_rZr)rOr’rt)r^r,r«r–s    r`r)zMultiIndex.delete•sO€ðEIÇJÁJÖO°[”R—Y‘Y˜{¨CÕ0ÐOˆ    ÐOÜØ—;‘;ØØ—*‘*Ø"ô    
ð    
ùòPsAcó$—t|t«r t|«}|€„t|«dk(r/t    j
t|«ftj ¬«St|t«stj|«}|j«j|«dk7S|j|«}|j|«}|jdk(r.t    j
t|«tj ¬«S|j|«S)Nrr¿r˜)rºrr¤r…rZrÂr£rOrÎrËrarrÎrôr3)r^rår›ÚnumÚlevss     r`r3zMultiIndex.isin¥sʀä fœiÔ (ܘ&“\ˆFà ˆ=ܐ6‹{˜aÒÜ—x‘x¤ T£  ´B·H±HÔ=Ð=ܘf¤jÔ1Ü#×/Ñ/°Ó7Ø—=‘=“?×2Ñ2°4Ó8¸BÑ>Ð >à×(Ñ(¨Ó/ˆCØ×(Ñ(¨Ó-ˆDày‰y˜AŠ~Ü—x‘x¤ D£    ´·±Ô:Ð:Ø—9‘9˜VÓ$Ð $rbÚ__add__Ú__radd__Ú__iadd__Ú__sub__Ú__rsub__Ú__isub__Ú__pow__Ú__rpow__Ú__mul__Ú__rmul__Ú __floordiv__Ú __rfloordiv__Ú __truediv__Ú __rtruediv__Ú__mod__Ú__rmod__Ú
__divmod__Ú __rdivmod__Ú__neg__Ú__pos__Ú__abs__Ú
__invert__)NNNNNFNT)rƒrOr”rOrNr)r›r¤rœr¤)NNN)r_ú list | Noner’r r¨zlist[int] | range | None)rr€rtú-Sequence[Hashable] | Hashable | lib.NoDefaultrNrOr/)rÌzIterable[tuple[Hashable, ...]]rr€rtú$Sequence[Hashable] | Hashable | NonerNrO)rÒzSequence[Iterable[Hashable]]rr€rtr rNrO)r×rMrr€rtrrNrO)rNú
np.ndarray)rNrN)rNrŒ)rNrF)rƒrOr„rOr”rOrNÚNone)r”rOrNrO)rNr )rNzCallable[..., MultiIndex])rårrNrO)rNrO)NFN)r.rOrNrr¹)rNr)rBr rNrO)rNznp.dtyperM©F)r.rOrNrŒ)rlrprNznpt.NDArray[np.object_])NNNFéNT)rsz bool | NonerzúCallable | Nonerlz
str | NonertrOrrŒr‹rOrNr¤)r˜rOrŽzbool | None | lib.NoDefaultrzrrNr¤)r„rO)rNrp)rNz    list[str])Úfirst)r½rrNr¦)r™)rÆrrNrO)r›rŒrËrOrNrB)rNrB)rrOrÔrOrNrM)ràrOrNrO)r^rOrúrõrNrO)rTN)r^rOrWrrrOrNrO)rrprNúnpt.NDArray[np.intp])r!rŒrNrO)NÚraise)r›z.Index | np.ndarray | Iterable[Hashable] | Noner*rrNrO)r)r*rrNrO)r0r˜)T)rƒrOrNz!Generator[np.ndarray, None, None])rNzlist[Categorical])rTTr)
r›rrHzbool | list[bool]rIrOrrprNz'tuple[MultiIndex, npt.NDArray[np.intp]])rMrO)rrBrMrOrNrB)rNr)rYrprNz"tuple[Index, npt.NDArray[np.intp]])rYrprNr)rNr)rhzHashable | Sequence[Hashable]rfúLiteral['left', 'right']rNrŒ)rNztuple[int, int])rp)rir»rfr)rxrBrBrrNrŒ)rT)r›rrˆrO)r)r›zint | list[int])rN)r›rŒrÈznpt.NDArray[np.bool_] | None)r©z,tuple[Scalar | Iterable | AnyArrayLike, ...]rÈrrNr)rrnrNrO)rrOrNrO)r“rrNrO)r•rOrNrO)rƒrO)rÂrOrNrO)r,rŒrNrOr¥)rcrdrerfrBÚ _hidden_attrsÚ    frozensetÚ_typrÚ__annotations__rFr÷rŽÚ _comparablesr‡ržrÚ classmethodrr°r¶r|rÎrÔrÚr'rÇÚpropertyrår´rîrñrôr’r‰r r¦rr_rŠrr&r)r(r+rÿrƒr;rrCr“rPrTrVrSrhror‡ršrœr‹rtr¢rr­r¶r¸rÚ _duplicatedrÄrÉr²rÎrËrÖrÙrÛr¥rârìrñrørûr&rCÚ_index_doc_kwargsrsr§rÞrr.r$r9r=r;rArrJrNrLrQrSrXrVrUrirkrgrsr?rr‡r€r¯r¨r»rÀrÈrÍrÕrÏr×rßrárËrorærîrðr)r3rÝrØrGrör÷rørùrúrûrürýrþrÿrrrrrrrrrr    r
r Ú __classcell__)r[s@r`rOrOäs(
ø…ñQðf×'Ñ'©)«+Ñ5€Mð €DØ$&€FÐ !Ó&Ù‹l€GÙ ‹\€Fؐ9€LàÓðØØØØØØ Ø!%ð-ðð-ðð-ð
ó-ó^ð4"Ø"Ø59ð    LàðLððLð3ó    Lð\ð!%Ø?B¿~¹~ð    D
ððD
ð=ð    D
ð
 
ò D
óðD
ðLØð!%Ø6:ð    MIà.ðMIððMIð4ð    MIð
 
ò MIóóðMIð^ð!%Ø?B¿~¹~ð    :Dà/ð:Dðð:Dð=ð    :Dð
 
ò :Dóð:Dðxð!%Ø6:ð    BJà ðBJððBJð4ð    BJð
 
ò BJóðBJðLòóðð2òóððñ 
óð 
ðòRóðRó4"ðòóððò8"óð8"ð|ØØØ!&ñ+ð
ð +ð ð +ðð+ð
ó+ð\ $¸dñ`Ø7;ð`à    ó`ðDò !óð !ðò 2óð 2ð$òóððØØØ!&ñ'ð
ð 'ð ð 'ðð'ð
ó'ðT#¸Tñ>Ø6:ð>à    ó>ðFñFóðFð:ò&óð&ñ    ˆ×    Ñ    ÓØ58·^±^óKóðKó
 
ð"ØØ ð    >ðð>ð
 
ó >ô@ô(ñ     ˆ×    Ñ    Óòóððòóðó<ñ    ˆ×    Ñ    Óó"óð"ð ò#óð#ôò2Kð %ñ"Øð"à     ó"ðL!Ø%)Ø!ØØØØðO!àðO!ð#ðO!ðð    O!ð
ð O!ð ð O!ððO!ð
óO!ðl&*ñ =ðð=ð.ð    =ð
#ð =ð
ó =óD'ð*.Àõ8ñt Ø Ø ð ô €Eð*òóðóð6ò?óð?ð<ò2óð2ðò6óð6ñ    ˆ×    Ñ    Óó%óð%ð€KóHñ     ˆ‰Óó
/óð
/ô4ó42ñh    ˆ‰ÓòDóðDðØ ^‰^Ø!&ð    XàðXðð    Xð
 
ó Xóx8ó<"3ðHò 8óð 8ôA
óFSòp7ò óD
ñ$Р Ñ(Ð+<Ñ<Ó=ðØØð 
Øð
ðð
ðð    
ð
ò
ó>ð
ò>=%ð@)/ñPØ"%ðPà    óPñР Ñ*Ð->Ñ>Ó?ó
ó@ð
ð(AEØ%ð    Y!ð>ðY!ðð    Y!ð
 
ó Y!ðx3:ðØ$/ðà    óô*8
ót"óH 
ð(,ð Ø $ð à    *ó ó
ð,Ø'+Ø#Ø"ð c"àðc"ð%ðc"ðð    c"ð
ð c"ð
1ó c"óJó ó)ðò=óð=ð ;Ø!ð ;à    +õ ;õFó(*ð29à,ð29ð'ð29ð
ó    29öj54ôn1Kóf,ò2xXôt5ônS)ðlLPðo%Øðo%Ø,Hóo%óbC7ðNVà 9ðVð&ðVð
ó    Vôp+
óZ<ó| õ  óD&ó
òó".ó2ò#ñ*    ˆ‰Óó óð ò ó&
óP!
óF
ñ     ˆŠƒ_ó%óð%ð(_Š_€Fñ
˜iÓ(€GÙ˜zÓ*€HÙ˜zÓ*€HÙ˜iÓ(€GÙ˜zÓ*€HÙ˜zÓ*€HÙ˜iÓ(€GÙ˜zÓ*€HÙ˜iÓ(€GÙ˜zÓ*€HÙ" >Ó2€LÙ# OÓ4€MÙ! -Ó0€KÙ" >Ó2€LÙ˜iÓ(€GÙ˜zÓ*€HÙ  Ó.€JÙ! -Ó0€Ká˜iÓ(€GÙ˜iÓ(€GÙ˜iÓ(€GÙ  Ó.„Jrbcóš—|Dcgc] }t|«‘Œ}}t|dd«D]}tj|d|«sŒ|cSycc}w)zJCount depth (up to a maximum of `nlevels`) with which codes are lexsorted.rr˜N)r+r r¯r°)r_r¦r«Ú int64_codesrs     r`r¥r¥ØsV€à@EÖF°”<  Õ,ÐF€KÐFÜ 7˜A˜rÓ "òˆÜ ×  Ñ   ¨R¨a Õ 1ØŠHðð ùò    Gs…Acóª—tt|Ž«}t|«}|d|dz}||}||dzdD]}g}tt||««D]q\}    \}
} |    |dz
k(r$|j    | «|j    |«n?|
| k(r|j    |«ŒL|j ||    d«|j    |«n|}Œ‘tt|Ž«S)NrU)r¤rËr…rqr§r‰) Ú
label_listr„r…Úpivotedrr•ÚprevÚcurÚ
sparse_currªÚpÚts             r`rŠrŠásð€Ü”3˜
Ð#Ó$€GÜ ˆJ‹€Aà [u˜q‘yÐ !€FØ 5‰>€Dàu˜q‘y{Ð#òˆØˆ
ä"¤3 t¨S£>Ó2ò    ‰IˆA‰v1ؐA˜‘EŠzØ×!Ñ! !Ô$ð— ‘ ˜jÔ)ÙàAŠvØ×!Ñ! (Õ+à×!Ñ! # a b 'Ô*ð— ‘ ˜jÔ)Ùð    ð"‰ð)ô, ”V Ó Ðrbcó¸—t|t«r |j›S|j}tj
dtj dij|d«S)NÚNaTÚNaN)rºr6rr(rZÚ
datetime64Ú timedelta64Úget)r“Ú
dtype_types  r`r†r†sF€Ü%œÔ(Ø—.‘.Ð!Ð"à—Z‘Zˆ
ä M‰M˜5¤"§.¡.°%Ð 8× <Ñ <¸ZÈÓ OÐOrbcóΗ|}t|t«r|D]}    |jdg«}Œ|S    |jdg«}|S#t$r|cYcSwxYw#t$rY|SwxYw)z¬
    Attempt to drop level or levels from the given index.
 
    Parameters
    ----------
    index: Index
    key : scalar or tuple
 
    Returns
    -------
    Index
    r)rºr»rr†)rrBÚoriginal_indexrƒs    r`Úmaybe_droplevelsr5
s€ð€Nܐ#”uÔðò    &ˆAð &Ø×1Ñ1°1°#Ó6‘ð    &ð €Lð     Ø×-Ñ-¨q¨cÓ2ˆEð €Løôò &à%Ô%ð &ûô ò    Ø à €Lð    ús"™A°AÁ AÁAÁ    A$Á#A$cód—t||«}|r|j«}d|j_|S)a
    Coerce the array-like indexer to the smallest integer dtype that can encode all
    of the given categories.
 
    Parameters
    ----------
    array_like : array-like
    categories : array-like
    copy : bool
 
    Returns
    -------
    np.ndarray
        Non-writeable.
    F)r*rƒrqrr)Ú
array_liker`rƒs   r`rr+s3€ô & j°*Ó=€JÙ Ø—_‘_Ó&ˆ
Ø!&€J×ÑÔØ Ðrbcó&—|Xt|«sMt|«st|›d«‚t|«dkDrt|d«rt|›d«‚|g}|g}||fS| t|«r't|«rt|d«st|›d«‚||fS)zT
    Ensure that level is either None or listlike, and arr is list-of-listlike.
    z must be list-likerz must be list of lists-like)r0rur…)r›rµÚarrnames   r`r
r
Bs­€ð Ф¨eÔ!4ܘCԠܘw˜iÐ'9Ð:Ó;Ð ;Ü ˆs‹8aŠ<œL¨¨Q©Ô0ܘw˜iÐ'9Ð:Ó;Ð ;ؐˆØˆeˆð #ˆ:Ðð
ˆœ, uÔ-ܘCÔ ¬ °S¸±VÔ(<ܘw˜iÐ'BÐCÓDÐ DØ #ˆ:Ðrb)rzrrNr)r_zlist[np.ndarray]r¦rŒrNrŒ)rr)r„rŒr…rn)r“rrNrp)rrBrNrBr)rƒrOrNr)r9rp)‡Ú
__future__rÚcollections.abcrrrrrÚ    functoolsr    Úsysr Útypingr r rrrr8ÚnumpyrZÚpandas._configrÚ pandas._libsrr¯rrgrÚpandas._libs.hashtablerÚpandas._typingrrrrrrrrrrr r!Úpandas.compat.numpyr"rþÚ pandas.errorsr#r$r%Úpandas.util._decoratorsr&r'r(Úpandas.util._exceptionsr)Úpandas.core.dtypes.castr*Úpandas.core.dtypes.commonr+r,r-r.r/r0r1r2r3r4Úpandas.core.dtypes.dtypesr5r6Úpandas.core.dtypes.genericr7r8Úpandas.core.dtypes.inferencer9Úpandas.core.dtypes.missingr:r;Úpandas.core.algorithmsÚcoreÚ
algorithmsÚpandas.core.array_algos.putmaskr<Úpandas.core.arraysr=r>Úpandas.core.arrays.categoricalr?r@Úpandas.core.commonÚcommonrÃÚpandas.core.constructionrAÚpandas.core.indexes.baseÚindexesÚbaserîrBrCrDrEÚpandas.core.indexes.frozenrFÚpandas.core.ops.invalidrGÚpandas.core.sortingrHrIÚpandas.io.formats.printingrJrKrìrLrMrNÚdictr ÚupdateÚBaseMultiIndexCodesEnginerhrSrprlr|rOr¥rŠr†r5rr
rjrbr`ú<module>ras}ðÝ"÷õõÝ÷õóãå%÷ñõ
.÷ ÷ ÷ ó õ/÷ñ÷
ñõ
5å8÷ ÷ ÷ ÷÷õ7÷÷
'Ð&Ý<÷÷÷!РÝ3ß(Ó(÷óõ 2Ý3÷÷
ñ
÷ññ ˜×0Ñ0Ó1ÐØ×ÑØÐ,JÑKôô
$3˜8×=Ñ=¸x×?TÑ?Tô$3ôN&3˜H×>Ñ>À×@UÑ@Uô&3óRô&q;/ôq;/óhw ôó@PóôBô.rb