Aller au contenu

Chapitre 5.4 - Fusions⚓︎

On considère dans ce sujet les trois fichiers csv décrits ci-dessous :

countries.csv contient des informations décrivant les pays :

  • CountryCode : le code du pays (texte, clé primaire)

  • Name : le nom du pays (texte)

  • Continent : le continent du pays (texte)

  • SurfaceArea : la surface du pays (nombre décimal)

  • Population : la population du pays (entier)

  • Capital : la capitale du pays (nombre entier correspondant à un ID dans le fichier cities.csv)

  • d'autres descripteurs qui ne nous intéressent pas ici...

languages.csv contient les informations sur les langues parlées dans chaque pays :

  • CountryCode : le code du pays (texte)

  • Language : la langue concernée par cette entrée (texte)

  • IsOfficial : cette langue est-elle officielle dans ce pays ? (texte, T pour True, F pour False)

  • Percentage : le pourcentage de locuteurs dans le pays (nombre décimal)

cities.csv contient des informations décrivant des villes :

  • ID : l'identifiant de la ville (entier)

  • Name : le nom de la ville (texte)

  • code : le code du pays dans lequel est situé la ville (texte)

  • District : la région d'appartenance de la ville (texte)

  • Population : la population de la ville (entier)

Import réalisés !

Dans toute la suite du TP, les listes pays, langues et villes contiennent les dictionnaires correspondant aux imports de ces différents fichiers.

Les données sont correctement typées (en particulier les valeurs isOfficial de la liste langues qui sont des booléens).

Python
pays = [
    {"CountryCode": "ABW", "Name": "Aruba", "Continent": "North America", ...},
    {"CountryCode": "AFG", "Name": "Afghanistan", "Continent": "Asia", ...},
    ...
]

langues = [
    {"CountryCode" : "ABW", "Language": "Dutch", "IsOfficial": True, "Percentage": 5.3},
    {"CountryCode" : "ABW", "Language": "English", "IsOfficial": False, "Percentage": 9.5},
    ...
]

villes = [
    {"ID": 1, "Name": "Kabul", "code": "AFG",, "District": "Kabol", "Population": 1780000},
    {"ID": 2, "Name": "Qandahar", "code": "AFG",, "District": "Qandahar", "Population": 237500},
    ...
]

Langues parlées dans chaque pays⚓︎

Quelles sont les langues parlées en Haïti ? Pour le savoir il faut :

  • parcourir la liste pays jusqu'à trouver le code de Haïti (orthographié Haiti dans la liste pays),

  • parcourir la liste langues et en extraire les valeurs correspondant à ce code.

Langues parlées en Haïti

Compléter le code ci-dessous permettant de déterminer les langues parlées en Haïti.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013NéS=P)5(gf6Hpiênh7eq/C]3 b-o:vL4r[0y9k_8lum1;+c.!2dRwtas050Z0t0$0%0o0P0(0z0V0P0%0(0(0e010$0o0n010406050(0Q0R0R0%0H0K040d0C0P0Q0|0C0q0z020%0R0n0T0z0!0t160H0u0Q0t0(050v13151719110n04051E1x1H0v1E110Z0o0E0;0?0^0`0?0q0j0Q0%0j0t0B0n0K0$0r1g0z0r0o0j0r0P1-0r0$0 050,0A0P0t1Q0@0_011,1.1:1.0$1_1{1@0$0H1F1(0;1c0(0n0%0q0`0Y011}1S010k0.0t0q1k0t1@2f2h2m1 2p1{2s0R2u040a0z0f0H0C0n0C0(0o1f1h0*2d0H0H0t0V2P1x2w0q1F0v1(2#292b2a1^0Z2y1T0o0q2r2M1@1N1P0=1~2/2;0q0C2^1@0n2U1F2Z2#35122g1h2`2n2~0H160P1@0%1+2U0k0`030N0N0V2 0t1:2}0C0B0S3w0 0z0S1x0%363910382x3b1 3d3f3h3j0t3l013n3p3r3t2=3w0B2k040z0Y3C3E2h3G2Z2.013L0%3g1F3i0r3k3m3o3q0*3V2~3X0y3z0y3%2Y3F113+3J0`3.3:053=3@3R3_3U2:3W3x0G3z0G421y443H3a1R3K0C3e3/3N3?3P3^3T3{4h3}3x0h3z0h4n3545393,494x4d3S3`3s4D3v3x0l3z0l4J4p464s484u3M3;3O3Q4R4g3u3X0s3z0s4!3)4L3I4%3-4)4w4+4y4-4f4C4:3x0O3z0O4^2!4`4r2{4}4v4a4c4z4e4B4T550B0L3z0L5a3*4M475f4*4b4,4A4S3|4V3w0J0 0S0J5s1I331x2^2(0Z2b2-5v4S2@1O1F320t343F433)054S5Z2x0o0Z0`3o2Z3X0S3N5+5-5l5C5:2l2C0t5@5B4U5`2#3D4q4N0 0o0N0r0-0|5#2!0z645v0C0 0e6c3!6f4|0R0o0 5I4o4_6k645?015.393X3Z5y6w535m4i3Y5{2t5~4/6G6B0v634$5e0M0 0#1,1{6k6e6Q3c0 2g0K1w6s2!6m5e0~040I6u6Z3K66686a0o6:5u4|6-0x6/6)5)5d2n0(3Z010b2t016`4{6,0 0x6X6+2n6h040X6j706Y6{5e740 010m6^79707g1 6-0D6k117w3+6D0N5/3x3 4+7F5 5n3 0z5|6K546G7J3%0z7W7n7b6!0467692O6_7m7x0`7i0U7l357Y721 6o5G7B7a1h7F7H0B4k7K5,6x5^604j6I2D7R6F4E7~1@6O3G7D4M7|6z4F5=816E5_8j7P6J827M6G4G627165044S7f6;7,6i8A7o7!6$6(378B016-6 8J8F6=7#6@7(7`3,6}8N5!8K7q04010w0C0Q0q290K8%0*7v8O7Z7y7d7_8f5*8l7G8i0B4X80888n8}865}8r6L8a8~3%7C8:7{8`7}4=8 957S8a4=8p879h895D9f428K0q0 1U1W1v8S6b7*8K7i7/3F7;8V0 0I7e709a8Y8g9d8|579g8m840B579l949S5n9Q9r8P0`6S040k4u8E8;480 2r290t0t9,7=7,0#660q9@8x9v1u8I9M9-8L0 7A9K8U8h2h3X5p9R835n5p9W909Tac7V7X7+019(0o0k9}5v9t049:2U9?8^9^a46.8U5v8!8$8(8*188-2uaD6|8?9A9$019C9D3)9Fat0 8zaz9G04a64Ka89Oaa3x5H8kai5na,ah9n91a,8v7Xa_aV4|au9 9x7%9z9b3,7i0WaM5eau0%0n0n2r0Zb62n6-0ibe8Qaw9=bi0`6-0g8@370v5(5K5Y5M5V1x0$5Pby2+2$0%1`bv0v5N1D8w5v2U0R0N0k0%0M0t687J1p1r1t1v0za$5!1K3G1E0F3i0A8(0=1|5%3r3,9 1Y1!1$1+1;231=2vaQ9(6U2q6ubs3r3!0Z2h0:0?0z2U0V0r0t0Hcc1|0Z0Q2d2R0Z007t7(0z2L0Q2T6a0z0%0Q0^0o0z0p9;ca1q0n0?0V0c1|2g0H0z8)6e4Sb;2h1Wb?1#0Kb_221;1?bK4|9(9*0Hc25(cv0V3q1l1Y0q0c0z2R0P002:0(290Q2W0o1*b/2R5vb=1ZcUcW1/cYb}a39(0A2UbQc)c40z1tcz2:0$ce2J1l0$0zc9b+c|1{bZ1I3G2^cQ1V1Xd41$1(1*21d724d9aA2A2r78040f1%1)9|7w5X713(6*bt7Ea)0q3Y3yad8s3}0Y3ya;9Y3Wd+5;5z5kd)3vd:8c6Pb~0 c%asa|9/aIblaPa30C9`7#dS7:anau8HbmaBb!6taZa9d#d+6B3i7L96d^6Hd-aed/er515Aepd$6N3Da_anapare4aAaubkayb25v8MeeaF772D8/a2aA6}d 5eaSeW7375co0|eS5$8K7zbqeT0zejd$7Uen8`d@e:93a.eu7Oewd?eyd+7U8da`am9saX3reZ1 9Cf89.ave2eKe-eM9HeO758%8)8+aKe(6*e*aOa%eid!d$7 6Ce?e 8bese@d+4kd=4.9ieqfxf2f3a{6R0 dc0tdea77wc30*2#dUbw0E8e0*0,0.0(04.

Le descripteur CountryCode permet donc de faire le lien entre les deux listes pays et langues.

Utilisons cette relation afin de déterminer les langues parlées dans un pays quelconque.

Langues parlées dans un pays

On demande d'écrire deux fonctions :

  • code_pays prend en argument la liste des pays ainsi que le nom d'un pays et renvoie son code ;

  • langues_parlees prend en argument les listes des données des pays et celle des langues (arguments pays et langues) ainsi que le nom d'un pays (nom) et renvoie la liste des noms des langues parlées dans ce pays.

Exemples

Python Console Session
>>> code_pays(pays, "Haiti")
"HTI"
>>> langues_parlees(pays, langues, "Haiti")
['French', 'Haiti Creole']

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013NéS=P)5(Ogfà6Hpinh7eq/Cx]V3, b-ùo:vLî4r[0ïy9k_8lum1;Ec.2dRwtasjô050)0u0,0-0q0W0.0D0$0W0-0.0.0e010,0q0p010406050.0X0Y0Y0-0N0R040d0H0W0X140H0r0D020-0Y0p0!0D0*0u1e0N0v0X0u0.050w1b1d1f1h190p04051M1F1P0w1M190)0q0J0|0~10120~0r0k0X0-0k0u0F0p0R0,0s1o0D0s0q0k0s0W1^0s0,17050@0E0W0u1Y0 11011@1_1{1_0,21231 0,0N1N1:0|1k0.0p0-0r120(01251!010l0_0u0r1s0u1 2n2p2u272x232A0Y2C040a0D0f0N0H0p0H0.0q1n1p0=2l0N0N0u0$2X1F2E0r1N0w1:2-2h2j2i200)2G1#0q0r2z2U1 1V1X0}262`2|0r0H301 0p2$1N2+2-3d1a2o1p322v360N1e0W1 0-1?2$0l12030U0U0$370u1{350H0F0M0F0Z170D0Z1F0-3e3h183g2F3j273l3n3p3r0u3t013v3x3z3B2}3E0F2s040D0(3L3N2p3P2+2_013U0-3o1N3q0s3s3u3w3y0=3(363*0B3I0B3:2*3O193@3S123`3|053~403!423%2{3)3F0M3I0M4b1G4d3Q3i1Z3T0H3m3{3W3 3Y413$444q463F0h3I0h4w3d4e3h3^4i4G4m3#433A4M3D3F0n3I0n4S4y4f4B4h4D3V3}3X3Z4!4p3C3*0t3I0t4-3=4U3R4:3_4=4F4@4H4_4o4L4|3F0V3I0V512,534A33564E4j4l4I4n4K4$5e0F0S3I0S5j3?4V4g5o4?4k4^4J4#454(3G0P170Z0P5B5l4W575q5I5t5K4%3*0Z3H045$5S4z5U5p4Y5s4`5d4r3G3,0Z3/0w3M4c525+5E4X594Z5c5v5=0Z485(4a5`3;5k5~55605H5a5J4{654t5(4v6a5|6c4/5n6f5r5b5u5L5#4P5(4R6o4x5}6r3k5V5.6v5Z5w0Z4*5(4,6C4T6d6s6H615/636x3F0Z4~5(506Q4.5D6e6U6g626w5!6Z5g5(5i6(6E6*6T5-6V6J6j4N3G5y5(5A6^2,1Q3b1F302:0)2j2^5E4#2 1W1N3a0u3c3O6p1N4#7m2F0q0)123w2+5#3W7t7v6/6L2t2K0u7B6K651 6o6F270T170=0l7o6S2v0+3I7S7M4h0l174#0U2o0R1E6D767Y0116040i7X6`3k177(7*3f7-7/0C7o0D7T3T17360Y7=545n7/0g0I7o197+7r1p7A017w3h3*3,5H8h6X6:3+7E2B7H6 5M8m7L7?277V3-0D8D865m2v0.0)17018L1x0r0J0H0q24232l2Z0)000X1p7_8L018c8F0D8o0U7x3F678n7u8i7C5=480D7F8u5;708.6a8D8E7-7O040l4D7 814h172z2h0u0u967-0H8B2{9e8z98047_8(5E7/8b8e8d7{4V8*8,3E7z8:8p5w4t8^8t8;7I706l3:8 9L8091170q7R8e9N9k3_990r9b9d8e977.170O9o550.3,010b2B8$9!7|170z9j872v0H170e0e9^8G8204849)88179r6R9;9v9A8+8k4O9z8`64704P9E2Lag6Y0F6z9K9Mar9#922$0,0X0N0r9 4W9W9Ya42v7/9(a99_279+8K0x0H8Y2h0RaN0=9:9uaJ127/9@9s8(9wad0F6N8/am8q4*ak7G9G8v3*a)6a9t7n3@a$2p4}afa:8{5M4~a.a+5w6#aq909Uau0^0.9Z3d9TaW3_2M0A3{1C0#2#95aIa0aX177;bp3^aL04010K24848^000-0p2o0N0-0L0,0D2o0{0)2p0{0~0D1{0.0,2CaE27898%bua{0r3*6=a*a ah5M5gb3b+anb)a@a#ab9x72b*9B5=5yb/b|70b`b?b#b^a%5Qa~c05Mc7b 8=70c72-5{9O047QbX128B80bu5 7!041$1(1D7%1f231Dcl9$7:cA0r7^0-7)cA7}aA5 17ct1C7`a_9UcJ9S9#cEa20H85cp5589a74yc47B9x5$c8cdca3Hcc9Hc.7Kch9Ucn8 cA8I8K8M2z8P8RbS3qbTbV0D0=0{84bN1Dd21%cObLcx0cdbbO0rbQ247_8)0r1V1B0cdf0N0D0.1=848#b!aV8gc5a|6Z8m3q8*c;5#2sc:a;dFc?8Cb8bgcV4#cK559{049~cT7-dT3zcwcHcZa5cCd*7@9mcGcP3=9#cSbecU83cXcI170gdAcQ7sdDb%6Z8.dHabdJe48salb:8q66dPa^d=a`e25#9Je6b46keaa/c9ekdP9Ld_042$1b0W0@0,dV5ndXdZd^9=040OaZa8dB8)ej6Zapemec6Laj8_eS65ap8~c`ci940NeCd.9a2$bd3Obfbq019g9Pazd!9UcVcNczd-bYa6d ehaac)c6a)eRer6Za-eVf63Ga?3MardRe/929Qe(a1e*9cd|eIc{9,aNaP1gaSbWe|br04eKe-9#eEeFfAd#7#3zfnc$5}c(8;c*b6f5c-5#b2f9fQ6Zb6eZfee!e^17ex0Xez0-eBfwe:170%cD17bE0p2z0)fnbteMcL04fle,f0bgaGfp8K0K2p1(1*fvf`c!9?d~a!fL8jdE3Gb)fPe8ghepenceb=3Meg7,f1fMc6b`gjdN71gmeWcec2fdfZbgau0?axe?eGf!ew1Df%eAe 760w7q777l797i1F0,7cgZ2?2.0-22gW0w7a1L8f3^2$0Y0U0l0-0T0u0U0s671x1z1BdbfJgS1T1O04aN9XbH0qg;9a0D0mbS000u0y1y0p8T2Z0o0-0Q14bL0N0c0$0c0=9X0C0D1=f=1m8)0$0q0D1m0_0qbcdu8Y240EaO0}24054#3^cNg71-0R1?1|2b1}2Db917e$7SgT3z3-0.bP0D0-d0du2$3yax0{he0W002{bU0N0X2(0q1=hS3zhUg51)1+hXhZ2a1|1~g/5E920E2$g^h+7q0%0D0#1p3Y0l0?hy8Ti60=gNaway1F7q0D0/aO240$240N0:23f.1S3P1M0j1p3q2Zhk0X0{0-iG1mdsbR2b2|80hT5EhVib1.id1`ifh%gGf#bbf~2,e.4Wbibk0ubm2Re%f+7/f_e0e/bwbybAcXbCf;1fbIbKbMd6h:i%hJbVaUj73^bZ9!h,izh;2x2Y240k0c2$du230{0$0 hz0GbSjb0Ydf10ds2zh;0N1(2L9X8^iI4Dex2Tdphdh;i28Ydf7)ipiS0D1DbKdjjEiIjG2Z2x1(2$dvhFh}1=3qit2%awi$3q0,0H0@1{0,ds0)0Xdth_0N0{0i2ZbRhOi2ixi+55i-1,i/29i;2ci?fgh)bo3fjt7l0gdvh:h=8Qh@c 0H0RkaiK0ceyeAiOh4g,0?0^0`04.

Capitales⚓︎

Quelle est la capitale d'Haïti ? Là encore, il faut :

  • parcourir la liste des pays jusqu'à trouver l'entrée correspondant à Haïti,

  • repérer le code de la capitale correspondante,

  • parcourir la liste des villes jusqu'à trouver le code cherché.

Nous allons effectuer ces actions pour chacun des pays présents dans la liste. La capitale étant trouvée, nous ajouterons une nouvelle clé CapitalName au dictionnaire du pays. La valeur associée sera le nom de la capitale obtenu.

Pas de capitale ?

Certains des « pays » listés n'en sont pas vraiment et n'ont donc pas de capitale. C'est par exemple le cas de l'Antarctique.

Lors de l'import des données, on leur a associé la valeur -1 à la clé Capital.

Liens

Quels sont les descripteurs permettant de faire le lien entre les listes pays et villes ?

  • Le descripteur "Capital" de pays et "Name" de villes
  • Le descripteur "Name" de pays et "Name" de villes
  • Le descripteur "Capital" de pays et "ID" de villes
  • Le descripteur "ID" de pays et "Capital" de villes
  • ❌ Le descripteur "Capital" de pays et "Name" de villes
  • ❌ Le descripteur "Name" de pays et "Name" de villes
  • ✅ Le descripteur "Capital" de pays et "ID" de villes
  • ❌ Le descripteur "ID" de pays et "Capital" de villes
Associer les capitales aux pays

Compléter le code ci-dessous afin d'ajouter à chaque dictionnaire correspondant à un pays une nouvelle entrée CapitalName contenant le nom de sa capitale.

On utilisera la chaîne vide "" comme valeur pour les « pays » sans capitale.

Ainsi :

  • le dictionnaire correspondant à la France contiendra un nouveau couple "CapitalName": "Paris",

  • celui de l'Antarctique "CapitalName": "".

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013N4r[S=0y9kP_T5gf8l6umpinh17Ie+c/C]FD2d3 b-owt:vas050M0D0T0W0x0s0X0O0F0s0W0X0X0g010T0x0w010406050X0u0v0v0W0d0i040f0R0s0u0=0R0y050G0|0~10120`0w04051i1b1l0G1i0`0M0x0V0*0,0.0:0,0y0p0u0W0p0D0Q0w0i0T0z190O0z0x0p0z0s1N0z0T0^050#0P0s0D1u0-0/011M1O1Q1O0T1W1Y1U0T0d1j1I0*150X0w0W0y0:0L011!1w010q0%0D0y0W0v0D1U1_1{201$231Y26280^0a0O0l0d0R0w0R0X0x180y0O0Z1@0d0d0D0F2t1b2b0y1j0G1I2G1:1=1;1V0M2d1x0x0y252q1U1r1t0+1#2Q2S0y0R2W1U0w2z1j2E2G2-0{1`2u2Y212$0d0 0s1U0W1L2z0q0:030m0m0F2%0D1Q2#0R0Q0o0Q0A0^0O0A1b0W2.2;0_2:2c2?1$2^2`2|2~0D3001323436382T3b0Q1~040O0L3i3k1{3m2E2P013r0W2{1j2}0z2 3133350Z3B2$3D0N3f0N3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0c3f0c3+1c3-3n2=1v3q0R2_3R3t3V3v3X3z3!3}3$3c0o3f0o432-3.2;3O3=4d3_3y3Z374j3a3c0t3f0t4p453/483;4a3s3T3u3w4x3|393D0B3f0B4G3L4r3o4J3P4L4c4N4e4P3{4i4S3c0r3f0r4X2F4Z472Z4$4b3?3^4f3`4h4z4.0Q0j3f0j4?3M4s3:4{4M3@4O4g4y3#4B3d0h0^0A0h584^4t4%4}5f505h4A3D0A3e045z5p465r4|4v4 4Q4-3~3d3F0A3I0G3j3,4Y5E5b4u4)4w4,525L0A3(5B3*5Q3K4@5U4#5W5e4*5g4R5#405B425*5S2F1m2+1b2W2J0M1=2O5b4y2V1s1j2*0D2,3l5|1j4y6d2c0x0M0:332E5y3t6k6m515i6p0O2h0D6s5w535A3+4I4`0k0^0q4a6f0O5-4`0y0^251:0D0D6K6M210R0S0^2R6U6E2@0^1`0i0X6f6V1$0@040U6f0`443L5E6r016n2;3D3F5e6`5Z6u3c1~6w276y6{6t5x741U5*0O7f6L6$3q0^0F0W0w2s3R6T6@2F7h5a4#0R0^0g6#7u6N6P0y6R7q2/7i0:6/0e6,7H010X3F010H7m7o2{7L7A216/0I6=7V6j6l796o3c5%707%727b0Q3(76286z5?4k7:7d3j7g7t4!6F6Z0q7z7 6%047l7n0#1Y834_6W7x7y7r3G6-0:7w040Q7#8c1$0v0x5m8n3O6/6;8g6?7G4s710m7)0Q5^7,7@5K7_407=787.538F7e7}7g8i3P7C7E8t5b7J8X4#7O0^7Q7S890b77018!4`7Y8b3O8k8f2-7~8o0:8$04018-8x8t8B8D4m4N8B6A5L4m8L8H5!7_943J7}8T6G04370X7F6e7M8v7!8g6_7-8C6}4C6q9t977_4D9a799z5j4D2G7|8R7f8T6O040q0$0T8;5b8?9R4#0k0F0^0J3R9l9q8z7$6s8D4U959y7^5j4U9C8N5L9+9f9J8_4t6Z9U4`9T8g9`5b8q0^5o909r3N929v0Q4:9,9b73ab1 6xae7/ac9^9J9h0^0S1M8aa08T6X0^2$9Qat7M9M9O2s8.7X0^8w4q919t8D55ad9D9.3D559;7a53aMam9_9KaA0^0V0%as8^au7x9}85a#0s1Y6+a77W6.0^7Ka;847j040xaEa?047Za69%2ua91{5y5laN9=7_5nah77aj6Bb8aWaXaoa|82aza=3;a!a$9m6^9oa@a~8{7P0C0K8 b38u0^b1a(7M8?8@3la15.7k8)7pbw019pb29n8AaKaa5z9xbf5#3eaS9E5y6C8QaXanaZ9j7D2zbs5}bu04a^bC5b8|8(883R8+2ibQ8:bna`8ja*c48`8U04a-a%bUc5bRbva_c9b|c029c2bE9$ceb4bWb63c5ObZaO8I5jcvb%aPcu6 b+b,9gb.aCaybGbo019 cLcf9W0^0n0d0ub=3mci0Ob50y5y7+2}96cC3d7;aicx9ccz7+cFbj7M9i9kcW8TbSaIcYc!5y8Fc(9-cyd0bd7?c.af0A8P9IcGcHcM9Ma}c88=0^0EbJ3LbL4`a35Bcp6^0G6h5~6c60691b0T63dA2M2H0W1Xdx0G616?0Z0#0%0X04.