Aller au contenu

Les listes Python

Remarque

Cette page rappelle rapidement les outils fondamentaux sur les listes Python.

Il ne s'agit pas d'un cours exhaustif sur ce thème.

Présentation

Les listes sont des structures de données linéaires : des valeurs stockée dans un certain ordre.

Considérons par exemple les données suivantes présentant des informations sur un animal (nom, espèce, date de naissance) :

Oli Chat 10 juin 2018

Ces données sont organisées en colonnes :

  • la première contient le nom,
  • la deuxième son espèce,
  • la troisième son jour de naissance,
  • etc

Ces données peuvent être représentées dans un objet Python de type list :

# indices   0      1     2     3      4
animal = ["Oli", "Chat", 10, "juin", 2018]

Dans ce cadre on distingue les indices et les valeurs des éléments :

  • l'indice correspond à la position de l'élément dans la liste (un peu comme le numéro de la colonne),

  • la valeur est le contenu à proprement parler.

Attention

En Python comme dans bien d'autres langages informatiques, les indices débutent à 0.

Notons immédiatement que, dans une liste, les valeurs peuvent être de types variés : ici des chaînes de caractères (str) et des entiers (int).

Utilisation

On rappelle les opérations suivantes sur les listes :

Création
  • Création d'une liste vide :
vide = [ ]
  • Création d'une liste « à la main » :
animal = ["Oli", "Chat", 10, "juin", 2018]
  • Création d'une liste contenant plusieurs fois la même valeur :
mille_None = [None] * 1000
Longueur
  • La longueur d'une liste est donnée par la fonction len:
>>> repertoire = ["Clarissa", "Dalloway", 14, "May", 1925]
>>> len(repertoire)
5
Lecture de valeur

Les valeurs sont repérées par leur indice (la première est à l'indice 0).

  • On accède à une valeur en utilisant des crochets [] :
>>> repertoire = ["Clarissa", "Dalloway", 14, "May", 1925]
>>> repertoire[0]
'Clarissa'
>>> repertoire[2]
14
  • La dernière valeur est à l'indice len(repertoire) - 1 :
>>> repertoire[len(repertoire) - 1]
1925
  • Python autorise les indices négatifs : la dernière valeur a pour indice -1, l'avant-dernière -2, etc
>>> repertoire[-1]
1925
>>> repertoire[-2]
'May'
Modification de valeur
  • On modifie des valeurs avec une simple affectation :
>>> animaux = ["éléfants", "girafes", "chevals"]
>>> animaux[0] = "éléphants"
>>> animaux[2] = "chevaux"
>>> animaux
['éléphants', 'girafes', 'chevaux']
Parcours

On considère la liste animaux = ['éléphants', 'girafes', 'chevaux']

  • Parcours selon les indices :
>>> for i in range(len(animaux)):
...     print("Indice :",i, "; Valeur :", animaux[i])
Indice : 0 ; Valeur : 'éléphants'
Indice : 1 ; Valeur : 'girafes'
Indice : 2 ; Valeur : 'chevaux'
  • Les parcours selon les valeurs :
>>> for animal in animaux:
...     print(animal)
'éléphants'
'girafes'
'chevaux'
Ajout d'éléments
  • On peut ajouter des éléments à la fin d'une liste en utilisant append() :

>>> conjonctions = ["mais", "ou", "et", "donc", "or"]
>>> conjonctions.append("ni")
>>> conjonctions.append("car")
>>> conjonctions
['mais', 'ou', 'et', 'donc', 'or', 'ni', 'car']
- On peut aussi ajouter des éléments à la fin d'une liste en y ajoutant une autre liste par exemple avec += :
>>> conjonctions = ["mais", "ou", "et", "donc", "or"]
>>> conjonctions += ["ni", "car"]
>>> conjonctions
['mais', 'ou', 'et', 'donc', 'or', 'ni', 'car']

Exercices

Activité 1 - Manipulations élémentaires

Compléter le code ci-dessous afin d'effectuer les actions demandées. Au bout de 10 essais infructueux, le corrigé vous est proposé.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tClH12Wà/vygj.]Ts9huqMi6Pé[dm0rA=7*fb) e:,B8np5(aSo3_4;zcx050C0O0b0X0x0d0r0N0)0d0X0r0r0H010b0x0U010406050r0u0D0D0X0F0l040Y0Z0d0u0~0Z0T050j1517191b130U04051r1k1u0j1r130C0x0k0?0^0`0|0t0x0m0t0d1I0t0b11050.0L0d0O1D0_0{011H1J1L1J0b1R1T1P0b0F1s0b0t0?1e0r0U0X0T0|0g011V1F010K0:0O0T0X0D0O1P1=1@1|1X1 1T2224110a0N0z0F0Z0U0Z0r0x1h0T0N0,1:0F0F0O0)2p1k270T1s0j1.2C1+1-1,1Q0C290|1L0T212m1P1A1C0@1W2M0x2O0T0Z2S1P0U2v1s2A2C2*141?2q2U1}2Z0F180d110N0f2z2.122-282:1X2=2@2_0g2|1@2~2A2L01330X2^040N0!372B133a310|3d3f0N0$3j392.3b3p2_0V3t3l3v3n3c0Z2?3e2_0y3A2 2/1E323F343g0I3K3m3N3o3P3H3g0S3T3C3V3E3G3q0s3#303%3x040f0E3,3M2V3(3Q0f2{1l2}3B3-3^3/0f363}383 3@2;3X3f0f3i453k3L3w4a110f3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4z3U414i3:3!4E3$4G4w0f3+4K4o3O4w0g3=4Q484S3Q0g3|2*4u4B4H0g444$4A3.4)4d2,1x2(1k2S2F0C1-2K3D0)2!251s4^1t4?4;2,4~0,2)4L1}0)0f11030N0c0F0A0O0F0N0u2O0N1L0r0b1U0k0x2s2Z175j5p0x5r0O0#0G3?3w115q5s5E3t0N4-3^0Z110H5M5O1}10040B0p3A4%3%5c5e5g5i5k5p0X5A5C2r0O0=5x0L2v0=210~5k0=4~0D2%5B0N5`2v2`0E620b2`0!0N0W2X0@0u0=0b0Z6f5p5;5:0u0*0M5G4}5d045f5x0D5z5J5D0R6q3.5I5B5K6A4m5N4F1}5Q045S6H5U1X5W0B3t6P0|0D0x4j4V2,6J6Q110Q5T6#6V6X3:4#2}6U015W6(6O6*016W4j4+6/6^6=6)5a1X6`3:4:6}710|5W5Z4t5#3^5%6t5)5j5l0^5.5s0?2X0v0u1@5K6h6h0N7o0x1:0T5{7y0N0V660K0Z617j0k3e0O0u5l027o0Z0b0%0q7P0Z7N0u7P0%6B41110)7n7p7y5D7s0Z704R0|6L6N2*6I776;116S4m6:0r1`047V7X7S6h807Q6T6~117a7=6:6L0J7-4X6+117C5!6:0T110m2v0-2X0m0r8e3b7:8t3D6R893~6:7e5f0G0n6i5s5l150)0)5;2n0k0O247A1T0=7I1T7L0=840%0e0O0d0d7U7O7Q670N8Y0h3F0d0C8Y0N0i0N8n0O8p0T8r7Z2;8m8o0~8|8s7{6^[email protected]^040W9i8f017}118Y8!8$8(7W85957@5W6p4W5H048_8{8}9y9j979n9D9d9f0T9h9I9o5W9m9R3b9q7 8)0%8.0F8:8Y9L8x119B4$067c8 040r3e1g0X2p948a965R8w3%6R9)3%9X8Y0R0n0F9(9V9*046?9{7@a39Z0D0E9P0!a86!9z888~1X8C0N0w2!0x1 0O0(0N9=1f0.9_0N0X1 2q7o02030!0s0%8#1T7x7z5o0C0A0r3X610Pap0|ar0Ba41i8F7L8Y0Q8,9Z1Ta+a-9w0%at9P0O8Y8z468B6s5f0W5o1?5}5*5l5w6i8O8$1U6y9,8A6^9baA9@9_a13^a0a93%736Z769j799~5P9}6@ae7~a%0Ta)a79ZaZ3c11bgaC0x1i9`bq9S7_bj1}736.386:bsbw9Jbvad9jafa=a/bD9C4BbG9?bIbKbP1X9Kbm7!9c9e9gb/78119Uamb!by9Za@0,albM3b9A3K0j570O2C2%cb4@1B4_2F2I2D0X1Sce0j4^13co0-0/0;04.
Activité 2 - Recherche d'indice

Écrire une fonction indice_min qui prend en paramètre un tableau non vide de nombres et qui renvoie l'indice de la première occurrence du minimum de ce tableau.

  • Les tableaux seront représentés sous forme de liste Python.
  • On n'utilisera pas les fonctions min et index.
Exemples
>>> indice_min([5])
0
>>> indice_min([2, 4, 1, 1])
2
>>> indice_min([5, 3, 2, 5, 2])
2

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=7flb)1 2e/vyg:]8swnuph5aS(o3k_i46P;[cdm0050P0m0c0B0I0g0u0k0O0g0B0u0u0d010c0I0y010406050u0x0Q0Q0B0b0p040C0E0g0x0,0E0w050n0?0^0`0|0;0y04051c151f0n1c0;0P0I0o0!0$0(0*0z0I0q0z0g1t0z0c0/050V0h0g0m1o0%0)011s1u1w1u0c1C1E1A0c0b1d0c0z0!0 0u0y0B0w0*0l011G1q010f0X0m0w0B0Q0m1A1Z1#1*1I1-1E1:1=0/0a0k0L0b0E0y0E0u0I120w0k0T1X0b0b0m0O2a151^0w1d0n1V2n1S1U1T1B0P1`0*1w0w1/271A1l1n0#1H2x0I2z0w0E2D1A0y2g1d2l2n2R0=1!2b2F1+2K0b0_0g0/0j2k2V0:2U1_2X1I2Z2#0/0l2)1#2+2l2w012:0B2$040F2@2m0;2`2.0*2}2 0J322_2V2{380/0A3b343d362|0E2!2~0/0K3i2,2W1p2/3n2;040e3s353v373x3p040t3b1g2P152D2q0P1U2v3l0O2L1?1d3N1e3L2T162*053T0T2Q3k3D010G0/0T0f3b0k3t3e0f0/2I1l0O0m0H0Q2I3J3C2G010.040D423+440w0/2K0Q0h2g0u492-3,460i0r3i0k4q3?432Y0/400w0I3=3@3l0E0/0d4z4t2/4d0E4f4h4j3u44460N4M2{400/0R4R3l460s4p4r4A3,4c040I3 2I4y3#2^4s4a1+4C044E4.2m4:4k444T044V4_0:4r4{4N1+3.040f3n4F4;4H4)5b4|4=0v3`1451543e0h0/0b1#0q0m4W4l0/48514$4b5o041}5u4O5w5E4u044e4g0m4i5y4G0*4m4n4!534q5z563`3;5l5W5d5K4L5O5c5Q0/4Q5)5g5d4-2T5P450/4Z5!5?4?020g0c0M5f555d4w5;3$5?464o51065U6c5m3l4(64612{4?4^2R6e4%4I4K5M5H1I4P6s373`6v5@045_2R6b6d535#6w4)4+4x6i4B4D6L6o5e6a6F5?572g0c0x0b5k6m6G2|3`6J652^0;0n3(0m2n2O6.3M1m3O2q2t2o0B1D6;0n3N6+0T0V0X0u04.
Activité 3 - Recherche de valeur

Écrire une fonction maximum :

  • prenant en paramètre une liste non vide de nombres : nombres
  • renvoyant le plus grand élément de cette liste.

Chacun des nombres utilisés est de type int ou float.

⚠ On interdit ici d'utiliser max, ainsi que sort ou sorted.

Exemples
>>> maximum([98, 12, 104, 23, 131, 9])
131
>>> maximum([-27, 24, -3, 15])
24

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tèl12à/vygj.]sw9huqiV6Pé[-dm0r=fb)I e:,Rnp5(aSo3Lk_4+;cx050B0L0b0T0u0d0o0K0%0d0T0o0o0F010b0u0Q010406050o0s0C0C0T0E0j040U0V0d0s0|0V0P0K020T0C0Q0$0K0O0L160E0t0s0L0o050h13151719110Q04051E1x1H0h1E110B0u0i0;0?0^0`0r0u0k0r0d1V0r0b0 050,0H0d0L1Q0@0_011U1W1Y1W0b1(1*1$0b0E1F0b0r0;1c0o0Q0T0P0`0f011,1S010G0.0L0P1k0L1$2224291.2c1*2f0C2h040a0K0x0E0V0Q0V0o0u1f1h0*200E0E0L0%2C1x2j0P1F0h1~2O1{1}1|1%0B2l0`1Y0P2e2z1$1N1P0=1-2Y0u2!0P0V2(1$0Q2H1F2M2O2_12231h2*2a2/0E160d0 0e2L2}102|2k2 1.31330 0f3724392M2X013e0T34040W3i2N113l3c0`3o3q0!3t3k2}3m3z0 0R3C3v3E3x3n0V323p0 0w3C1I2@1x2(2R0B1}2W3M0%2:2r0)1O1F2?0L2^383T3%0*3/3b1R1.0Y0 0*0G3C0K3a2~3_3y0G0 160(0u0C143T3w43010~040S4c3L4e0P0 2/0C0H2H1w1y3:4d2+4f0 0I0M3J0K4C404v30460T483 413m0V0 0F4K4F3d4n0V4p4r4j3^4w4g0z4X424w0C0u0 0D4$3m4g0n4B4D4L3M3{040G3O4Q4k4w4m040i3p0L0s0E4|4Y2a0V0p0 2-564%4G044o4q1v4-3M4g4A4t3j064D5r4E4}2a4^0u3~5o2N5t574S5052545d4M0 020k0b0$5H3M4 470u5k4e5m4;5s5s4?4l4H4J5z045B5e1.4N044P5%5)3F0 511*5G5%5q4=4R0`4^2H0b540P5O5!045R3J1x3=3.3U6a0h3X1x0b3Z6f2U2P0T1)6c3X1D3@5*0`2H0C0Z0G0T0Y0L0Z0r0W0 1p1r1t1v0K5n2{1K391E0J0d0K0o000T0k2B0K0B000s2!0K2H0%0r0L0E6%1+2E5R4a0C2l0u6G0m0K0X0T0K1Y0o0b1+0y0,0P0b0K2/0P0A0i0u0*0N0K1g0K2-2B0u3p0u0o1+0?0K510E7h6m4069654I5S0h7t0K0T0i2I6{6`3-4)0c2H7n5F0E0m1I390r0e7e0B0`7o7h720L0A6$542A7B0A2y540A0?0A3c7X0*0A6~322-520 0v177V6~6#0y0%7!1O1+7(0E7D2l6,1+7;4)2f1*1x7P392(3m1:1X1Z1#3,3V6K2{7t5Z4w4^3}634~457u486/5T4Z0 4i5%8r5f5h4W8F5|4x040N8v5f7w2{8L5,5.8S5u1.4)4+8B2a4g4z678L5a5(4=8K8X0`0o0B5J1t0V5M028@8_8{0$2H0P0i0V0u7l1+6.140K237=6{6H8I6H0B02030W0q0$2-1N0%6H0u0K0l0s0o1t9g9i0$0g852c0P8`0s8^0$9C9E9G5M5W5:4@5b5y2_4C8G5D8R389L4e8U8V9U9R3y0H0 2o8#1.4g8E8W5C3y4T4V5j8.9.8M0I8P5+0 0A9`0`8Z04369?6r8M6J385`5X9!015~0+619~3n9:5i4s9-a44!9)9/049T3jaa4/9Kaa4^0L0/0Lana59K5raa5Q7vaf8UafaF8z4ba34.8DaA4 9daj4u8/8M8O5/aE5baH0 0#afa0a2akaO049_5_5X9Q8L5w9O9Z8LaR4UaiaAamaN5Pa!a 5U0 4:aY8T5J5L5Nb6aVaKaq2Nas0 a65pa:5Ya=0 5 aebb9@a`9;aTar8La~a+b0apa}b4aC5{aVawaybB04bi3ubkaDbm04bo0E62bqa4bd677x3(2O3-2O6o3W0+0-0/04.
Activité 4 - Modification d'un tableau

Écrire la fonction remplacer prenant en argument :

  • une liste d'entiers valeurs
  • un entier valeur_cible
  • un entier nouvelle_valeur

et renvoyant une nouvelle liste contenant les mêmes valeurs que valeurs, dans le même ordre, sauf valeur_cible qui a été remplacée par nouvelle_valeur.

La liste passée en paramètre ne doit pas être modifiée.

Exemples
>>> valeurs = [3, 8, 7]
>>> remplacer(valeurs, 3, 0)
[0, 8, 7]
>>> valeurs
[3, 8, 7]
>>> valeurs = [3, 8, 3, 5]
>>> remplacer(valeurs, 3, 0)
[0, 8, 0, 5]
>>> valeurs
[3, 8, 3, 5]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128073.8217.128013.127797tCèlO12à/vygj.]TswEhuqUi6Pé[-dm0rA=7*fb) êe:,8Rnp5(aS!o3Lk_4;zcx050H0U0e0%0B0h0u0S0=0h0%0u0u0M010e0B0!010406050u0y0I0I0%0K0o040(0*0h0y170*0Z0S020%0I0!0:0S0Y0U1h0K0z0y0U0u050m1e1g1i1k1c0!04051P1I1S0m1P1c0H0B0n0 1113150x0B0p0x0h1*0x0e1a050`0Q0h0U1#1214011)1+1-1+0e1?1^1;0e0K1Q0e0x0 1n0u0!0%0Z150k011`1%010P0|0U0Z1v0U1;2d2f2k1|2n1^2q0I2s040c0S0D0K0*0!0*0u0B1q1s0^2b0K0K0U0=2N1I2u0Z1Q0m292Z2628271=0H2w151-0Z2p2K1;1Y1!101{2-0B2/0Z0*2?1;0!2S1Q2X2Z341d2e1s2^2l2}0K1h0h1a0j2W381b372v3a1|3c3e1a0k3i2f3k2X2,013p0%3f040+3t2Y1c3w3n153z3B0/3E3v383x3K1a0#3N3G3P3I3y0*3d3A1a0C3U3l391$3o3Z3q040N3(3H3+3J3-3#040X3N1T321I2?2$0H282+3X0=2~2C0@1Z1Q310U333j3|460^4e3m3?010-1a0^0P3N0S3)3Q0P1a2S1w110=0U0K3|3=2_0119040$4D3W4l0Z1a0n3A0U0y0K1H1J4f4E2l4H0W4r4t3X4N044P1^4S0.0=0B1@0U4K4k4F4Z4#4X3o1a2}0y0n0U0h1^0.4*4R4C4V3u4$4l4H0R0V3U0S5f4s4`3J4w1G0y0h0`0e4_4L4F0*1a0M5q4?4Y1a0F0s5e5g594F4n040P3Z5w3*4F4(501B2p5p572Y5h5r2l0*0v1a2{5K3Q4O4Q4S4U365i4G1a5d5S1b5g5=5U5x1|5G0B4q5:5@5L3b1a5O2B0Z5R345~3x5t040M5v5}5E604)5(0K4-4/1^4=5 1|4H5/34065?6t674%5k1e5n0%654W5V1|690r6m5$040%0!0!2p0H6H3X4H4J5:6e4{044}4 510U536h6P5a1a0R5C6t6U155G500u4;6T5,6p6+6u5f6-3y6x5m5o6%5s1a6G6?6D5j6J6L6N715y4I7b6V625Q7e155b6_6|5G2S0e4S0Z5#6w042S6y705:1c0m4h4d3}7C0m401I0e427H2)2!0%4:2Z401O4j6n154x0.0P0%0-6!0x0+1a1A1C1E1G0S6q4f1V3k2?3x0%0H0I1r2M0B1r0S0H2f0p4B1a1O7=7@7_2N0G170e24040L225Q7{7r7/7R0,0%7}5{2n0=6 0E7}1_4A0e0S0U0?4B4.4A8w0u8v1E000|0S7X1p0S4c0Z0H2S0S0u0*2{8s0S2/8L120S7^1Y2n4B0S118(0B8D1_2{7`4Q0r6{8i3 4a1X0_0{0}3x0e1G8~0;2j2I2p15934(3G1f1C1k0t8 0U0;2W991M3k1P0A8W0B0H0E1_1E0B0S0n0B5Q0S0l8(001G312M8C8v8)1e1Z2f8~7,1T7:1Z3x1~1,1.1:4b3~366T7B7S3x5G4p7s4M4v7u1B0!4z4B0.2q5{7i5-7d755^77545)9=4^6d5,4(9{6i4.4:9}1a4!9 766}6W0*4~5052a2a6045c7la05%4+4T0.3sa99_01696c666|a16h5*3j6s5D5,5G5I56axam040B9%5s5YaL8haJaa0Z0Q4w7 6=5+aa6R9=aU1a2zai6SaZatazao0uaqai0Rak7y6`7m5Z5|aSa-an55a:ara,7T9?0Fa$5Zai5Basb4avaw3j6v4Ma 4,a46l9^b46^a^6`aEaTbiapb26Cat4Hb6bm6IaMbA6Q1abaa}bc5uaN6f6Xaf6!ahbp6{aF5k7p0KaRbfaybtb13U3Va~6ga/bK6EbJbb3xby9=0I0B1a3DbD6(04a8bH3xb;1a3{b^4@a7b*15b~3/b93;aa5G1{4B6B3ubg5M5k4y0%4A6i9:a|bwbn1aa+cp6Ia2aB586@[email protected]|cBb=040Ja=c4au5ubecf6|b/c12lc6cLcU6ocGbX5,c6c0cEbEb`cNc63:cY7jbFc9atcb13cdcNa.b0cNbdcNcTc)4lcCaib{c#aac%d4c,cJc.d1c204bGbf7z9Y7D7P8^1R041A460!9v0;0 1_0u0=0K188v4.0G0^130y0~0!0y8+0S8~8,0;0G1^741W3 8`0|0u9N2@4l7?7^0Z7`7|2{5I821R84d!d$0Z882M8b0d0Sd?0d9M7R0a0S0f508l8W0K0E2J8N8X0~0%0y8L2H1@0g2B0W8w1s0U0P0P0_dKad8v6;e6ep461gdv9s0h0b2{8D0K0y2U8g4s9Ycvaq0S0M9taA1I9Y7}1r9:8v0^0y0?8V0*0I0~8#0P0E2S64e7e9060I0T2B0S0*0Q0q0_8;0w1se23A2M0Eef05eFaAa;7A47048V0b8 e60S0y8WbM6Z8*8,dQ3k7Fdm7;3XdZ86eDd(6983fl85d#87898b8k8Q1n1peD312I2K9peg2Q2SeC1rd`dn0i39e21_0H1r0=f98We8261_1-8,0S9reO9D0TfYfV0SfX8Pe/e;0eeff%6;0K8l4Afde$0n0*0ofG2e0K8(8l5I0ZfK0Zfg8j8l8R1o2NeafE0ufGdxfGfafZ8+9K9u2P7*9z7|es9,0g9Ke88I4S8w8v9y2B1e8P2p8X0K464S9J8(7+cv8Ue~f3cveMf3ga8@0ndWd,fnd%0Zd)9jg#fu8gd:8a2C0L1p8PgdfB7|2J136k6=dRfk4l9Q201/309V7.36djbS049$cA9(ci9,ck4Ba*b7b(c|c/9?d5cRaKa26ja5hm9~cHbhacae6Z6#aoa=7-3uaDbRbs6Wc}b,hw5MaV04a)hucrhjgUhRajalhIeGbvhpaaavc 5zb:cJcXdd7cdgh#at690Oc`4|hXc?1aaHh@aLc}aP5!hchNaW0Z80hihm4(bWcxa!6)hE3Fa_h99;i26fhUh-cZ04bzim77bCiq9?h/5T6|c~ij6VhrbkaYctc*ie5;bqhHb%hZaiipiEhxisiOdeivf4ixhLd6b%fcag6$bQ5?a`046:iDibbx5.6_ighYf0h!2YcSh)i8b8hViTcg5WiWh:b4c{9|hViNi,j2i{it4HiThGi~5_bT7qh}iL7ygV4idkgYfh7Q49dX4Ffmg,g%g)frdYftd.g.8bgmfzgeeD0%4 fUf!9KgIgve20x2p2LfL8?1PfOf-gM9De8g{8Le9fBf!8%jEjL1_g22b1wjPjReDelfa4s1B042Ie#6A55dK4B9:2S1Ij`9L8?g 4Fh19Sh47C9Wh7f3i(hbhM3b9)4xhfcli7itj34Td9iz9`6hhsbljac!j16IiZbOi#kzajiGjdi(7ojhkub5hTkFiXb45`cokB7tbPkjb+040)cQiwhqkwiCcN6/0}i+k%hIkDhB55k+h{5JkNkrh 5Ziak/iKeLi|3(f2jm1V3~figZ7zjq7FdT0}04.